2014-10-29 103 views
2

Matlab初學者。比方說,我有一個矩陣Matlab Double For Loop

A = [ 2,3,4; 
     6,9,1; 
     7,8,3; 
     2,2,2 ] 

我想要操作的每一列進(潛在不同大小)的新列,然後我想擁有全新的矩陣。作爲一個例子,假設我想擺脫每個小於4的數字並且將其他數字提高到四次方。這比我實際想要做的要簡單得多,所以不要太多地閱讀這些細節。

如果我這樣做對特定列,說的第一個,我會做

newcolumn=[]; 
for r=1:4 
    if A(r,1)<4 
     newcolumn=newcolumn 
    else 
     newcolumn=vertcat(newcolumn,(A(r,1))^4)) 
    end 
end 

是否有可能做一個雙重for循環創建整個矩陣?

感謝

+2

如果元素小於每列4數目不相等應該發生什麼?我希望你意識到我們不能刪除它,因爲如果你希望它是一個矩陣,那麼每一行中元素的數量應該是相等和相同的。在你的例子中,如果我刪除小於4的元素,那麼A將是一個vector ='[6 7 9 8 4]'。現在如何將它安排在一個新的矩陣中? – 2014-10-29 02:32:36

回答

1

所以,如果你想要的列不再是大小相同的,那麼你將不得不使用一個單元陣列或墊你數值矩陣與一些defualt值,大概NaN。同時你並不需要一個雙循環,因爲你上面的循環是不必要的:

newcolumn=[]; 
for r=1:4 
    if A(r,1)<4 
     newcolumn=newcolumn 
    else 
     newcolumn=vertcat(newcolumn,(A(r,1))^4)) 
    end 
end 

相當於

newcolumn = A(A(:,1) < 4, 1).^4; 

所以現在你只需要循環沿着列:

jaggedArray{1,size(A,2)} = []; %// Pre-allocate your array (NB for efficiency in Matlab!) 
for col = 1:size(A,2) 
    jaggedArray{col} = A(A(:,col) < 4, col).^4; 
end 
0

如果結果每行有不同數量的元素,則可以使用cell array來存儲它。

兩種可能的方法:

  1. 使用arrayfun(其等同於一個for環):

    B = arrayfun(@(n) A(n,A(n,:)>=4).^4, 1:size(A,1), 'uniformoutput', false); 
    

    這需要每隔數n1最多行size(A,1)的數,並適用於它,它可以做你想做的。然後它將結果放入B{n}。選項'uniformoutput', false表示結果不是標量,因此會創建一個單元格數組來存儲它們。

  2. 使用cellfun:如果您要應用到每一行的功能,而不是使用匿名功能複雜,你可以在一個文件中通常定義它,說foo.m。在這種情況下,它更容易,如果你的函數接受一個行(不是數字n)作爲輸入:

    %// File foo.m 
    function y = foo(x) %// x is a row, y is a row of possibly different size 
    y = x(x>=4).^4; 
    

    你再拆A到其行

    Acell = mat2cell(A, ones(1,size(A,1)), size(A,2)); 
    

    ,然後的單元陣列打電話cellfun與一個function handle給你的函數:

    B = cellfun(@foo, Acell, 'uniformoutput', false); 
    

我知道這一切可能是有點出乎Matlab的初學者的知識,但是這就是答案的點:-)