矩阵运算matlab来移动值

时间:2015-09-26 13:15:21

标签: matlab matrix vectorization

我有一个矩阵,我想创建一个新的排序,例如

vals = [1 2; 3 4]

我还有两个矩阵,new_x和new_y,new_x(a,b) = jnew_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?

2 个答案:

答案 0 :(得分:1)

基本上,您正在尝试获取一个矩阵,当使用new_xnew_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.'

如前所述进行验证时,请使用outnew_xnew_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