2015-10-12 110 views
-1

我有一個字符串S1='ACD'。我生成基於​​所述S1的矩陣如下:從單元陣列中的字符串創建矩陣

fullSeq = 'ABCD'; 
idx = find(fullSeq == setdiff(fullSeq, 'ACD')); % it is OK 
M(:,idx) = 0.5 
M(idx,:) = 0.5 
M(logical(eye(4))) = 0.5 

的輸出是行:

M = 

0.5000 0.5000 0.2003 0.3279 
0.5000 0.5000 0.5000 0.5000 
0.8298 0.5000 0.5000 0.2452 
0.7997 0.5000 0.7548 0.5000 

現在,我想用一個循環儘管細胞陣列輸入單元,以產生3所述細胞陣列中的3串的矩陣(根據上面的代碼),如下所示:

input_cell= {'ABCD','ACD', 'ABD'} 


for i=1:numel(input_cell) 



    M = 0.5*rand(4) + 0.5; 

    M(triu(true(4))) = 1 - M(tril(true(4))); 

    fullSeq = 'ABCD'; 
    idx = find(fullSeq == setdiff(fullSeq, input_cell{i})); % something wrong here 

    M(:,idx) = 0.5 
    M(idx,:) = 0.5 
    M(logical(eye(4))) = 0.5 

end 

錯誤是:

Error using == Matrix dimensions must agree. 

Error in datagenerator (line 22) 
idx = find(fullSeq == setdiff(fullSeq, input_cell{i})); 

如何解決此問題以生成3個矩陣?或者使用其他解決方案而不是使用「for循環」?

+0

與上一個問題有何不同? –

+2

'setdiff(fullSeq,input_cell {1})'是'setdiff(fullSeq,'ABCD')',它返回一個空矩陣。我確實在我的[以前的答案](http://stackoverflow.com/questions/33011701/create-matrices-from-a-given-cell-array-of-strings-with-different-lengths)指定到這個問題(你應該從這裏鏈接到),那麼當'setdiff'返回一個空的marix時你必須考慮這個情況。我告訴過你那裏會出錯。 – Dan

+0

@丹:感謝您的評論。如果input_cell = {'BCD','ACD','ABD'},則代碼正常。但是,當我嘗試更改input_cell = {'CBAD','ACD','ABD'}時,它仍然是一個錯誤。 – kgk

回答

1

嘗試改變

fullSeq = 'ABCD'; 
idx = find(fullSeq == setdiff(fullSeq, input_cell{i})); % something wrong here 
... 

這樣:

fullSeq = 'ABCD'; 
letter = setdiff(fullSeq, input_cell{i}) 
if isempty(letter) 
    idx = find(fullSeq == letter); 
    M(:,idx) = 0.5 
    M(idx,:) = 0.5 
end 
M(logical(eye(4))) = 0.5 

而且,你意識到你只是在每次迭代覆蓋M實際上從未存儲過去的結果吧?

+0

謝謝!它工作得很好。但它似乎可以處理每個字符串的長度等於fullSeq。順便說一下,我還將每個向量形式的每個向量的值存儲在一個新矩陣中,如下所示:vector = reshape(M。',[],1) vector = vector'%從列變爲1行數據(i,:)=矢量 – kgk

+0

data = []; vector = reshape(M。',[],1); vector = vector'%從列更改爲1行;數據(i,:)=矢量 – kgk