2011-02-01 38 views
11

Tôi muốn nối ngang các dòng của một chuỗi ô của chuỗi như được hiển thị bên dưới.Theo chiều ngang nối mảng ô của các chuỗi

start = {'hello','world','test';'join','me','please'} 

finish = {'helloworldtest';'joinmeplease'} 

Có bất kỳ chức năng tích hợp nào thực hiện việc chuyển đổi ở trên không?

Trả lời

1

Một cách đơn giản là quá vòng qua các hàng

nRows = size(start,1); 
finish = cell(nRows,1); 

for r = 1:nRows 
    finish{r} = [start{r,:}]; 
end 

EDIT

Một tham gia nhiều hơn và hơi khó đọc giải pháp mà không giống nhau (các giải pháp chung là trái như một bài tập cho người đọc)

finish = accumarray([1 1 1 2 2 2]',[ 1 3 5 2 4 6]',[],@(x){[start{x}]})

+0

Cảm ơn, nó hoạt động, tôi đã dành 20 phút cuối cố gắng làm điều đó với vectorization - Tôi không thể nhớ lần cuối cùng tôi thực sự đã sử dụng một vòng lặp trong Matlab :) –

+0

@Chris R: Như bạn thấy, có là một giải pháp không lặp sử dụng accumarray, mặc dù bạn có thể không muốn sử dụng nó. Dù sao, nếu vòng lặp không thực hiện quá nhiều cuộc gọi hàm, nó thường là hợp lý nhanh trong các phiên bản mới hơn của Matlab. – Jonas

+2

@ChrisR: nếu bạn không thích for-loop, bạn có thể viết trong một dòng như: 'finish = arrayfun (@ (i) [bắt đầu {i ,:}], 1: size (bắt đầu, 1), 'UniformOutput ', false)'; ' – Amro

22

Có một cách dễ dàng không lặp mà bạn có thể thực hiện s sử dụng các chức năng NUM2CELLSTRCAT:

>> finish = num2cell(start,1); 
>> finish = strcat(finish{:}) 

finish = 

    'helloworldtest' 
    'joinmeplease' 
+0

+1 Tôi không biết bạn có thể gọi num2cell trên một véc tơ! – Jonas

+0

Đây phải là câu trả lời được chấp nhận. –

-1

Tôi nghĩ rằng bạn muốn là hai được nối như là một mảng tế bào duy nhất. Hãy thử sử dụng mã này, làm việc cho tôi.

'x = [{start}, {finish}];'

+0

biến mẫu 'kết thúc' được dự định là đầu ra ** (kết quả cuối cùng). Nó không phải là một phần của đầu vào. – Hoki

+0

Thay thế đơn giản 'X' bằng 'kết thúc' –

Các vấn đề liên quan