2012-11-06 29 views
17

Giả sử tôi có một tế bàolàm thế nào để chuyển đổi một tế bào để chuỗi trong matlab

v = 'v' [576.5818] [3.0286] [576.9270] 

     'v' [576.5953] [3.1180] [576.8716] 

     'f' [  56] [ 58] [  52] 

     'f' [  56] [ 58] [  52] 

và tôi muốn chuyển đổi này cho một mảng tế bào sử dụng một chuỗi định dạng cho mỗi phần tử: ' %.5f'

Làm thế nào tôi có thể làm cái này? Tôi đã thử cách tiếp cận sau, nhưng tôi gặp lỗi:

f1 = @(x) sprintf(' %.5f',x); 
cellfun(f1, num2cell(v),'UniformOutput', false) 

Tôi gặp lỗi ???

Error using ==> sprintf

Function is not defined for 'cell' inputs.

Error in ==> @(x)sprintf(' %.5f',x)

Bất kỳ một thể giúp tôi cảm ơn trước

Trả lời

2

Hãy thử điều này: (. Công trình theo một số Google results)

sprintf(' %.5f',x{:}) 

21

String là một mảng tế bào

Vâng, không thực sự .. Nó là một ma trận, nhưng tiếp tục đọc.

Tôi đoán mảng ô là loại dữ liệu thần bí nhất trong MATLAB. Vì vậy, hãy làm sáng tỏ nó một chút ;-)

Giả

fruits = {... 
    'banana',... 
    'apple',... 
    'orange'... 
} 

Trước hết số nguyên lập chỉ mục không cần thiết cho mảng nhỏ. Tốt hơn hết là sử dụng foreach giống như công trình xây dựng. Thật vậy,

for index = 1:numel(fruits) 
    fruits{index} 
end 

tương đương với

for fruit = fruits 
    fruit 
end 

phải không?

Vâng, không hoàn toàn. Vòng lặp đầu tiên tạo ra các chuỗi, trong khi chuỗi thứ hai cung cấp các ô. Bạn có thể kiểm tra xem nó với

for index = 1:numel(fruits) 
    [isstr(fruits{index}) iscell(fruits{index})] 
end 

for fruit = fruits 
    [isstr(fruit) iscell(fruit)] 
end 

, ví dụ: [1 0][0 1].

Nếu bạn có điểm khác biệt, thì bạn phải biết phải làm gì với ví dụ tiếp theo (trong trường hợp này thực sự liên quan đến câu hỏi của bạn (!) Tôi hứa!). Giả sử bạn cố gắng làm nối ngang trong một vòng lặp:

for fruit = fruits 
    [fruit 'is a fruit'] 
end 

Bạn sẽ nhận được

ans = 

    'banana' 'is a fruit' 

và vân vân. Tại sao? Rõ ràng mã này cố gắng ghép một mảng ô lồng nhau vào một chuỗi (một mảng ô có chứa một ma trận ký tự tạo thành chuỗi như 'chuối').Vì vậy, câu trả lời đúng là

sử dụng {:}

for fruit = fruits 
    [fruit{:} 'is a fruit'] 
end 

kỳ diệu này đã được sản xuất dự kiến ​​'chuối là một loại trái cây', 'táo là loại quả' vv

gợi ý

Một vài gợi ý:

  • Index miễn vòng lặp hoạt động độc đáo với cấu trúc như trong for fruit = [fieldnames][1](fruits)'
  • Trên đây là đúng cho mã nguồn mở quãng tám
  • chuối không chỉ là trái cây, taxonomically nó cũng là một loại thảo dược ;-) giống như 'chuối' trong MATLAB là cả chuỗi và ma trận, nghĩa là khẳng định (isstr ('chuối') & & ismat ('chuối')), nhưng khẳng định (iscell ('chuối')) không thành công.
  • {:} tương đương với cell2mat

PS

một giải pháp cho câu hỏi của bạn có thể trông như thế này:

Với

vcell = {... 
    'v' 576.5818 3.0286 576.9270; 
    'v' 576.5818 3.0286 576.9270  
} 

chỉ các loại số index-khôn ngoan bí mật để dây

vcell(cellfun(@isnumeric, vcell)) = cellfun(@(x) sprintf('%.5f', x), vcell(cellfun(@isnumeric, vcell)), 'UniformOutput', false) 

Trên đầu ra đang

vcell =

'v' '576.58180' '3.02860' '576.92700' 
'v' '576.58180' '3.02860' '576.92700' 

mà có thể được nối.

6

Giả sử chúng ta có một tế bào như sau:

my_cell = {'Hello World'} 
class(my_cell) 
ans = 
cell 

Chúng ta có thể có được chuỗi ra khỏi nó đơn giản bằng cách sử dụng toán tử {:} vào nó trực tiếp.

class(my_cell{:}) 
    ans = 
    char 

Lưu ý rằng chúng tôi có thể sử dụng biểu thức mycell{:} ở bất kỳ nơi nào chúng tôi sử dụng chuỗi bình thường.

+0

Con đường để đi! Không bao giờ nói gravedigging không bao giờ giúp đỡ bất cứ ai. –

+0

gọi hàm không cần thiết gọi là 'sprintf' một hack - là một lol –

2

Bằng cách nhìn trong file strjoin.m tôi thấy điều này:

string = [x{:}]; 
Các vấn đề liên quan