matlab中的矩阵运算用于移动值
我有一个矩阵,我想创建一个新的排序,例如matlab中的矩阵运算用于移动值,matlab,matrix,vectorization,Matlab,Matrix,Vectorization,我有一个矩阵,我想创建一个新的排序,例如 vals = [1 2; 3 4] 我还有两个矩阵,new_x和new_y,这样new_x(a,b)=j和new_x(a,b)=k意味着我希望vals(a,b)处的值映射到new_vals(j,k) 例如,给定 new_x = [1 2; 2 1] new_y = [2 2; 1 1] 我想要 新值=[4 3;1 2] 我知道我可以编写两个for循环来构建新的数组,但是matlab在提供对整个矩阵的运算方面是出了名的。我的问题是,在没有for循环的情
vals = [1 2; 3 4]
我还有两个矩阵,new_x和new_y,这样new_x(a,b)=j
和new_x(a,b)=k
意味着我希望vals(a,b)处的值映射到new_vals(j,k)
例如,给定
new_x = [1 2; 2 1]
new_y = [2 2; 1 1]
我想要
新值=[4 3;1 2]
我知道我可以编写两个for循环来构建新的数组,但是matlab在提供对整个矩阵的运算方面是出了名的。我的问题是,在没有for循环的情况下,如何构建新的VAL?基本上,您试图得到一个矩阵,当使用
new\u x
和new\u y
进行索引时,将得到VAL
,即-
输出(新x(1,1),新y(1,1))
必须等于vals(1,1)
输出(新x(1,2)、新y(1,2))
必须等于vals(1,2)
,依此类推
我们稍后将尝试验证这一点。现在,这里有一个使用线性索引的解决方案
-
nrows = size(vals,1); %// Store number of rows
%// Calculate linear indices
idx = (new_x + (new_y-1)*nrows);
%// Trace/map back to sorted version of "1:numel(vals)"
[~,traced_back_idx] = sort(idx(:));
%// Index into vals with traced back linear indices & then reshape & transpose
out = reshape(vals(traced_back_idx),[],nrows).'
这是另一种可能更快的方法-
out = nan(size(vals));
out((new_x + (new_y-1)*nrows)) = vals;
out = out.'
正如前面为验证所讨论的,让我们使用new_x
和new_y
索引out
,这应该与vals
匹配。这里有一个这样做的代码-
for ii = 1:size(out,1)
for jj = 1:size(out,2)
check_back(ii,jj) = out(new_y(ii,jj),new_x(ii,jj));
end
end
样本运行-
案例1(问题样本):
案例2:
我想我明白你在这里想做什么了。new_x和new_y只是新值矩阵rigth的坐标?问题是你所尝试的方法只对向量有效,而对矩阵无效,所以唯一的方法是将矩阵转换成向量,对值重新排序,然后返回矩阵,如:
vals = [1 ,2; 3, 4];
A=reshape(vals,1,4); % A is a vector [ 1 3 2 4]
new_coord=[2,3,4,1];
B(new_c)=A; %B is [4 1 3 2]
new_val=reshape(B,2,2) %back to matrix
获取新值=[4 3;1 2]。此外,B=A(新的_c)也是允许的,但坐标不同,即使以这种方式考虑rigth坐标也很容易
我相信一定有办法包含新的x矩阵,并将所有内容转换为新的坐标,你能一步一步地解释一下还是添加for-loop实现?@Daniel我认为从
new\u x
和new\u y
计算的线性指数可以追溯到从1到numel(vals)
的线性指数。如果我没弄错的话,这有点像是映射回来的。@Daniel。。或者追溯到numel(VAL)的排序版本。@Divakar:为了进一步复制结果,我找到了两种解释数据的方法,都得到了预期的输出。我将等待其他人接受你的回答或对其发表评论;我现在正在看他的反应
vals =
1 2 5
3 4 5
6 8 3
new_x =
1 2 3
3 1 2
3 2 1
new_y =
2 2 3
2 1 1
1 3 3
out =
4 5 6
1 2 3
3 8 5
check_back = (must be same as vals)
1 2 5
3 4 5
6 8 3
vals = [1 ,2; 3, 4];
A=reshape(vals,1,4); % A is a vector [ 1 3 2 4]
new_coord=[2,3,4,1];
B(new_c)=A; %B is [4 1 3 2]
new_val=reshape(B,2,2) %back to matrix