1

我是 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矩阵的第一行,并且值ofData被放入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中是否有一种快速简单的方法来做到这一点?许多函数返回索引,我希望有一种简单的方法可以使用这些索引更新/构造矩阵。

谢谢,

格雷格

4

3 回答 3

3

我知道如何做到这一点的最干净的方法是根据您的数据和索引创建一个稀疏矩阵:

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

希望有人出现并向我们展示一种更清洁的方法。

于 2013-11-07T01:27:35.313 回答
3

你所描述的是这样完成的:

[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);.

于 2013-11-07T01:27:44.997 回答
2

这个基于 的解决方案bsxfun似乎比@nispio 和@chappjc 的解决方案要快一些:

S = max(Indices(:));
Result = zeros(S);
Result(bsxfun(@plus, (Indices-1)*S, 1:S)) = Data;
于 2013-11-07T11:30:17.850 回答