我有一个矩阵,我想创建一个新的排序,例如
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)。 / p>
例如,给定
new_x = [1 2; 2 1]
new_y = [2 2; 1 1]
我想要 new_vals = [4 3; 1 2]
我知道我可以编写两个for循环来构建新数组,但是matlab非常擅长提供整个matricies的操作。我的问题是,如何在没有for循环的情况下构建new_vals?
答案 0 :(得分:1)
基本上,您正在尝试获取一个矩阵,当使用new_x
和new_y
编制索引时会给我们vals
,即 -
output(new_x(1,1),new_y(1,1))
必须等于vals(1,1)
,
output(new_x(1,2),new_y(1,2))
必须等于vals(1,2)
,依此类推。
我们稍后会尝试验证这一点。目前,这是使用linear indexing
-
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.'
如前所述进行验证时,请使用out
和new_x
将new_y
编入索引,并与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(问题样本):
vals =
1 2
3 4
new_x =
1 2
2 1
new_y =
2 2
1 1
new_vals =
4 3
1 2
out =
4 3
1 2
check_back = (must be same as vals)
1 2
3 4
案例#2:
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
答案 1 :(得分:0)
我想我知道你在这里想做什么。 new_x和new_y只是new_val矩阵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
获得new_val = [4 3; 1 2]。同样B = A(new_c)也是允许的,但是使用不同的坐标,eventhoug很容易以这种方式思考rigth坐标。
我确信必须有办法包含new_x矩阵并将所有内容转换为new_coord