インデックスと値マトリックスからマトリックスを作成します

StackOverflow https://stackoverflow.com/questions/19825916

  •  05-07-2022
  •  | 
  •  

質問

私はMatlabを初めて使用しましたが、ドキュメントをトロールしており、探しているものに対する答えを見つけることができません。

私はマトリックスで多くの計算を行いましたが、それらのインデックスに入るべきインデックスのリストと値のリストになりました。

例えば:

Data =

         0         0         0         0         0         0
    3.7417    3.7417    3.7417    7.0711    3.3166    3.3166
    4.2426    4.2426    3.7417    7.0711    5.3852    7.0711
    7.0711    6.0828    5.3852    7.4833    6.0828    7.6158
    7.1414    7.4833    7.8740    8.7750    7.1414    7.8740

Indices =

     1     2     3     4     5     6
     3     3     1     1     6     5
     2     1     2     6     3     4
     4     5     5     2     2     2
     5     4     6     5     1     3

私ができることは、の最初の列になるように、指数マトリックスで見つかった最大の価値のあるインデックスに基づいてサイズnの正方行列を構築することです。 Indices の最初の行のインデックスに使用されます Result マトリックス、およびの値 Data 対応する場所に置かれています Result データセットが0にインデックス付けされていないすべての場所を持つマトリックス。

つまり、上からのデータとインデックスのマトリックスを使用して、最終的なマトリックスを次のようにしたいと思います。

Result =
          0   4.2426    3.7417    7.0711    7.1414         0
     4.2426        0    3.7417    7.4833    6.0828         0
     3.7417   3.7417         0         0    5.3852    7.8740 
     7.0711   7.4833         0         0    8.7750    7.0711
     7.1414   6.0828    5.3852         0         0    3.3166
          0   7.6158    7.8740    7.0711    3.3166         0

(私が手でやったので、上記にいくつかの間違いがあるかもしれませんが、それは私がやりたいことのアイデアを提供するはずです)

Matlabでこれを行う簡単な方法はありますか?多くの関数はインデックスを返し、これらのインデックスを使用してマトリックスを簡単に更新/構築する方法があることを望んでいました。

ありがとう、

グレッグ

役に立ちましたか?

解決

私がそれを行う方法を知っている最もクリーンな方法は、データとインデックスに基づいてスパースマトリックスを作成することです。

[M,N] = size(Indices); indmax = max(Indices(:));
Result = sparse(repmat(1:N,M,1),Indices,Data,indmax,indmax);

うまくいけば、誰かがやって来て、さらにきれいな方法を見せてくれることを願っています。

他のヒント

あなたが説明していることはこのように達成されます:

[II,JJ]=meshgrid(1:size(Data,2),1:size(Data,1));
Result = zeros(size(Data,2));
Result(sub2ind(size(Result),II(:),Indices(:))) = Data(:);

取得することに注意してください II を通って meshgrid ステートメントは同等です II=repmat(1:size(Data,2),size(Data,1),1);.

に基づいて、このソリューション bsxfun, 、@nispioと@chappjcによるものよりも少し速いようです:

S = max(Indices(:));
Result = zeros(S);
Result(bsxfun(@plus, (Indices-1)*S, 1:S)) = Data;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top