2016-09-07 9 views
1

に行と列を見つける:どのように私は、変数行列持っているMATLAB

A = [1  2  8  8  1 
    4  6  8  1  1 
    5  3  1  1  8]; 

を、私は、変数Bを持っている:

B=[2 3 1 8 8]; 

質問は、変数の行と列(列でソート)を見つける方法であります変数Aの値2を見つけて最初の行と列に移動し、次にインデックス5まで処理したいが、行と列がある場合は使用されているのでget第2の位置(例えば、同じ値を有するインデックス4 &)。

rows; 
columns; 

結果は次のとおりです。

rows = 1 3 1 1 1 
columns = 2 2 1 3 4 

答えて

0

使用が見つけ使用してsub2indあなたが 望むものを達成するが、そのためにあなたが最初

A = [1  2  8  8  1 
    4  6  8  1  1 
    5  3  1  1  8]; 
B= [2 3 1 8 8]; 
TMP = A.'; 
for i = 1:length(B) 
    indx = find(TMP== B(i),1,'first') %Finding the element of B present in A 
    if(~isempty(indx)) % If B(i) is a member of A 
     [column(i),row(i)] = ind2sub(size(TMP),indx) % store it in row and column matrix 
     TMP(indx) = nan; % remove that element 
    end 
end 
の転置を取ることができます

カラム=

2  2  1  3  4 

行=

1  3  1  1  1 

ウサマ・あなたは

row = zeros(1,sum(ismember(B,A))) 
column= zeros(1,sum(ismember(B,A))) 

を使用することにより、上記のコードでも動作することを行うことができます メモリの事前割り当てを示唆したコメントの一つのようにAの中にBのメンバーがいない場合

+0

この解決策の欠点は、行列Aを変更することです。 – NLindros

+0

あなたはいくつかの温度マトリックスに保存することができます – Umar

+0

私はOPのために便利ですが、Bの値がAの最大値より大きい場合、コードが破損します – obchardon

0

使用find。この関数は、線形インデックスまたは行/列インデックスの両方を返すことができます。線形インデックスは、列ごとにダウンしたとして、結果はここにあなたの例では1(異なること

rows = 1 3 1 1 2 
cols = 2 2 1 3 3 

注:

ソリューションは

idx = zeros(size(B)); 
for i = 1:numel(B) 
    % Find all indexes 
    tmpIdx = find(A == B(i)); 
    % Remove those already used 
    tmpIdx = setdiff(tmpIdx, idx); 
    % Get the first new unique 
    idx(i) = tmpIdx(1); 
end 
% Convert index to row and col 
[rows, cols] = ind2sub(size(A),idx) 

を与える可能性が線形インデックスを使用してまだ正しいインデックスですが)

rows = 1 3 1 1 1 
columns= 2 2 1 3 4 

これを取得するには、 (A.')行列と行を反転する(ind2subの結果)

+0

@Sardar_Usamaああ、はい、正しい。しかし、非複雑な行列/配列の場合、それらは同じですか?それとも私が気付いていない別の違いですか? – NLindros

+0

これは、実数の共役が同じ数であるためです。したがって、機能は同じだと言うかもしれませんが、 'A 'が転置であると述べているのであれば、この文は間違っています! –

0

ここで私はforループを使用しているので、反復回数と計算コストを最適化しようとしました。 BとAの間に対応する値がない場合、行/ colインデックスはNaNを返します。

[Bu,~,ord] = unique(B,'stable'); 

% Index of each different values 
[col,row] = arrayfun(@(x) find(A'==x),Bu,'UniformOutput',0) 

% For each value in vector B we search the first "non already used" corresponding value in A. 
for i = 1:length(B) 
    if ~isempty(row{ord(i)}) 
     r(i) = row{ord(i)}(1); 
     row{ord(i)}(1) = []; 
     c(i) = col{ord(i)}(1); 
     col{ord(i)}(1) = []; 
    else 
     r(i) = NaN; 
     c(i) = NaN; 
    end 
end 

結果:

c = [2 2 1 3 4] 

r = [1 3 1 1 1] 
+0

'r'と' c'のためにメモリをあらかじめ割り当てることを考えてください。これは、ループ内でベクトルサイズを大きくする良いプログラミングの習慣とは考えられないからです。参考までに、これを読んでください:http://www.mathworks.com/help/matlab/matlab_prog/preallocating-arrays.htmlあなたの解決策はうまくいくようです:-) –

+1

@Sardar_Usamaは 'col'と' row出力が一様ではないためです。しかし、ええ、 'C =ゼロ(長さ(B)、1);を作成することは可能です – obchardon

関連する問題