Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
matlab中的矩阵运算用于移动值_Matlab_Matrix_Vectorization - Fatal编程技术网

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