3

私はMatlabの初心者ですが、本当に学ぶ必要があります。それが私の研究に非常に役立つことを願っています。今、私は次の問題に直面しています。

2 つの画像 (A と B という名前) があります。どちらも同じ次元 (4169,6289,7) に 7 つのレイヤーがあります。まず、A 画像で最大値を持つレイヤーを見つけてから、B 画像で対応する値を調べたいと思います。例: A 画像の 5 番目のレイヤーに最大値がある場合、B 画像の 5 番目のレイヤーの値が必要です。このコード c=max(a,[],3) を書いて、A画像で最大値を持つレイヤーを見つけましたが、B画像で対応する値を取得するように設定する考えはありません。これについて私を助けてもらえますか。

どうもありがとう

4

2 に答える 2

1

maxの値は必要ありません。2番目の引数、つまりインデックスが必要です。

 [~,indexOfMax] = max(a,[],3); %#Get index of maximal element
 [g1,g2] = ndgrid( 1:size(a,1),1:size(a,2) );  %#Create all possible rows,cols
 linearIndex = sub2ind(size(a), g1(:),g2(:),index(:))  %#Linearize the index of the maximal elements
 value = b(linearIndex); %# Collect the maximal values from b

@RodyOldenhuisは、メモリ消費について正しいです。これは、よりメモリ効率の高いforループアプローチです:(より速く実行される場合とされない場合があります。自分で確認してください)。

 vals = zeros(size(a(:,:,1)));
 [~,indexOfMax] = max(a,[],3);
 for i=1:size(a,1)
    for j=1:size(a,2)
        vals(i,j) = b(i,j, indexOfMax(i,j));
    end 
 end
于 2012-10-25T08:47:46.313 に答える
0

これは別の見方です。これは、メモリ効率が少し高いです。

% get the indices in 3rd dimension for the max values
[~,I] = max(imgA,[],3)

% Collect all values through double loop
Bvals = arrayfun(@(y) ...
    arrayfun(@(x) imgB(x,y, I(x,y)), 1:size(imgA,1)), ...
    1:size(imgA,2), 'UniformOutput',false);

% reshape them so they correspond to the images' size again
Bvals = reshape([Bvals{:}], size(I))
于 2012-10-25T09:33:17.613 に答える