2014-03-29 79 views
0

我寫這個(columnrowvalue是向量):迭代通過矢量

for k = column 
    for l = row ((column == k) & (row > k)) 
     A_lk = value (row == l & column == k); 

的問題是,kl是矢量,所以我不能寫row == lcolumn == k(我希望這些i爲其中row (i)lcolumn (i)k)。

確切的錯誤是: 「mx_el_eq: nonconformant arguments (op1 is 46x1, op2 is 13x1)」。

我怎麼可以使用列中的所有元素,並用一行((column == k) & (row > k))一個?

我想過是這樣的:

for i = 1:length(column) 
    k = column (i) 

是否有任何其他的可能性?

編輯:

正如我說,我有一個稀疏矩陣(N,N)。我必須遍歷所有列和每列(比如k),我必須遍歷從k + 1到n的行,並對非零元素進行操作。

例子:

row = [1 3 3 2 1 2]  % row > 2 is [0 1 1 0 0 0] 
column = [1 1 2 2 2 3] % column == 2 is [0 0 1 1 1 0] 
value = [8 7 9 5 6 7] %(column == 2) & (row > 2) is [0 0 1 0 0 0] 

row ((column == 2) & (row > 2))是3
value (row == 3 & column == 2)是9

我想要的代碼做什麼:

k in {1, 2, 3} %writing this I realized I did some useless operations, 
       %since I want just the distinct values of column 
k = 1: 
    l in row ((column == 1) & (row > 1)) = {3} 
     l = 3: 
      A_31 = value (row == 3 & column == 1) = 7 
      %rest of the code 
k = 2: 
    l in row ((column == 2) & (row > 2)) = {3} 
     l = 3 
      A_32 = value (row == 3 & column == 2) = 9 
      %rest of the code 
k = 3: 
    l in row ((column == 3) & (row > 3)) = nothing 
+0

的'對於i = 1:長度(列),K =柱(我)'似乎不錯編碼 – tashuhka

+0

是的,我知道我想要做什麼,但似乎有點不自然MATLAB。 – nowembery

+0

這似乎對我來說很自然,但讓我們等待其他SO用戶給他們的意見.. – tashuhka

回答

1

看一看的match_value的值下面的代碼,看看你是否可以使用它們 -

row = [1 3 3 2 1 2]  % row > 2 is [0 1 1 0 0 0] 
column = [1 1 2 2 2 3] % column == 2 is [0 0 1 1 1 0] 
value = [8 7 9 5 6 7] 

k_vector = 1:numel(column) 
match_ind = bsxfun(@gt,row,k_vector') & bsxfun(@eq,column,k_vector') 
match_value = bsxfun(@times,match_ind,value) 

輸出爲match_value

match_value = 

    0  7  0  0  0  0 
    0  0  9  0  0  0 
    0  0  0  0  0  0 
    0  0  0  0  0  0 
    0  0  0  0  0  0 
    0  0  0  0  0  0 

如果您打算使用稀疏的輸出,你可以這樣做很容易像這樣 -

>> sparse(match_value) 

ans = 

    (1,2)  7 
    (2,3)  9 
1

遍歷列與簡單的unique幫助 - 我們可以很容易地拔出每列的下三角部分的非零元素是這樣的:

% this relies on 'row' and 'column' both being row vectors 
for c = unique(column) 
    colidx = (column == c); 
    lowertri = (row > c) & colidx; 
    v = value(lowertri); 
    % do something with v 
end 

如果v的元素的行索引也很重要(而不是僅僅遍歷這些值本身),則可以並行使用row(row>c),或者僅使用與列相同方式的內部循環。