Matlab 从索引和值矩阵创建矩阵
我是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
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
函数。:)然而,在我看来,你在速度上获得的东西在可读性上失去了。