Matlab 从索引和值矩阵创建矩阵

Matlab 从索引和值矩阵创建矩阵,matlab,matrix,indices,Matlab,Matrix,Indices,我是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

我是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

我想做的是构造一个平方矩阵(大小为n,基于索引矩阵中的最大值索引),这样
索引的第一列
用于索引
结果
矩阵的第一行,并且
数据
的值被放入
结果
矩阵的相应位置,所有位置都没有索引,数据设置为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中是否有一种快速简便的方法来实现这一点?许多函数返回索引,我希望有一种简单的方法来使用这些索引更新/构造矩阵

谢谢


Greg

我知道的最干净的方法是根据数据和索引创建稀疏矩阵:

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

希望有人能给我们展示一种更干净的方法。

我所知道的最干净的方法是根据您的数据和索引创建一个稀疏矩阵:

[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(:);

注意,通过
meshgrid
语句获取
II
相当于
II=repmat(1:size(数据,2),size(数据,1),1)

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

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

注意,通过
meshgrid
语句获取
II
相当于
II=repmat(1:size(数据,2),size(数据,1),1)

此解决方案基于
bsxfun
,似乎比@nispio和@chappjc的解决方案快一点:

S = max(Indices(:));
Result = zeros(S);
Result(bsxfun(@plus, (Indices-1)*S, 1:S)) = Data;

此解决方案基于
bsxfun
,似乎比@nispio和@chappjc的解决方案快一点:

S = max(Indices(:));
Result = zeros(S);
Result(bsxfun(@plus, (Indices-1)*S, 1:S)) = Data;

我想它不会比这更干净了。如果这是您的目标,您可以始终使用
full
包装
sparse
+1@chappjc我一直希望有一天会有人来告诉我如何在不使用
sub2ind
的情况下为矩阵中不相交的元素列表编制索引。出于某种原因,我一直反对这样一个事实,即我必须提供我索引到的矩阵的大小。是的,下标是成对的这一事实并不直观。为什么
结果([12],[12])
指的是4个元素,而不是2个元素很难接受。如果MathWorks能够为“自动sub2ind”行为使用不同的括号就好了。我认为它不会比这更干净了。如果这是您的目标,您可以始终使用
full
包装
sparse
+1@chappjc我一直希望有一天会有人来告诉我如何在不使用
sub2ind
的情况下为矩阵中不相交的元素列表编制索引。出于某种原因,我一直反对这样一个事实,即我必须提供我索引到的矩阵的大小。是的,下标是成对的这一事实并不直观。为什么
结果([12],[12])
指的是4个元素,而不是2个元素很难接受。如果MathWorks能够为“自动sub2ind”行为使用不同的括号就好了。+1用于编写自己的
sub2ind
函数。:)然而,在我看来,你在速度上获得的东西在可读性上失去了。+1用于编写你自己的
sub2ind
函数。:)然而,在我看来,你在速度上获得的东西在可读性上失去了。