在倍频程/matlab中求指数矩阵

在倍频程/matlab中求指数矩阵,matlab,matrix,octave,vectorization,indices,Matlab,Matrix,Octave,Vectorization,Indices,给定倍频程/Matlab中的多维矩阵A 得到与a相同大小的矩阵的最简单方法是什么?所有元素都被它们在第k维上的索引替换 黑客帝国 A = ans(:,:,1) = 0.095287 0.191905 0.226278 0.749100 ans(:,:,2) = 0.076826 0.131639 0.862747 0.699016 我想要一个函数f,这样 f(A,1)= f(A,2)= 及 f(A,3)= 同样,给定一个稀疏矩阵B 得到另一个相同

给定倍频程/Matlab中的多维矩阵A

得到与a相同大小的矩阵的最简单方法是什么?所有元素都被它们在第k维上的索引替换

黑客帝国

A =

ans(:,:,1) =

   0.095287   0.191905
   0.226278   0.749100

ans(:,:,2) =

   0.076826   0.131639
   0.862747   0.699016
我想要一个函数f,这样 f(A,1)=

f(A,2)=

f(A,3)=

同样,给定一个稀疏矩阵B

得到另一个相同大小的稀疏矩阵的最简单方法是什么,其中非零元素被它们在k维上的索引替换?(与上述问题相同,但仅适用于非零元素)

理想情况下,我正在寻找一种能够很好地对倍频程进行矢量化的方法(这意味着它不会显式地循环任何东西)

澄清:对于稀疏矩阵1,我正在寻找一种解决方案,该解决方案不涉及在任何点创建全尺寸(B)矩阵

ndgrid()
做您想要的事情,尽管不是以您正在寻找的格式。如果事先知道输入A的DIM,则可以使用以下行创建N维网格:

% for matrix a where ndims(a) == 3
[x, y, z] = ndgrid (1:size(a,1), 1:size(a,2), 1:size(a,3));
% x is like f(a, 1)
% y is like f(a, 2)
% z is like f(a, 3)

您可以围绕ndgrid()编写一个自定义包装器,将其转换为所需的函数格式

如果有人好奇,因为我不知道ndgrid,下面是我的答案:

function [y] = indices(a,k)
    s = size(a);
    n = s(k);
    D = length(s);
    x = permute(a,[k,1:(k-1),(k+1):D]);

    y = reshape(x,n,[]);
    y = diag(1:n) * ones(size(y));
    y = reshape(y,size(x));

    y = permute(y,[(2:k),1,(k+1):D]);
endfunction

function [y] = spindices(a,k)
    s = size(a);
    n = s(k);
    D = length(s);
    x = permute(a,[k,1:(k-1),(k+1):D]);

    y = reshape(x,n,[]);
    y = spdiag(1:n) * spones(y);
    y = reshape(y,size(x));

    y = permute(y,[(2:k),1,(k+1):D]);
endfunction

谢谢,你能给我指一下ngrid的文档吗。我搜索了“octave ngrid”,但没有找到它是
ndgrid
不是
ngrid
。这是著名的
meshgrid
函数的扩展。哦,似乎它只是matlab。它不存在于八度音阶中。编辑:Nvm我发现,对于高达3的NDIM,
meshgrid
在倍频程中执行相同的作业meshgrid似乎会排列尺寸,而ndgrid不会
ans(:,:,1) =

   1   1
   1   1

ans(:,:,2) =

   2   2
   2   2
% for matrix a where ndims(a) == 3
[x, y, z] = ndgrid (1:size(a,1), 1:size(a,2), 1:size(a,3));
% x is like f(a, 1)
% y is like f(a, 2)
% z is like f(a, 3)
function [y] = indices(a,k)
    s = size(a);
    n = s(k);
    D = length(s);
    x = permute(a,[k,1:(k-1),(k+1):D]);

    y = reshape(x,n,[]);
    y = diag(1:n) * ones(size(y));
    y = reshape(y,size(x));

    y = permute(y,[(2:k),1,(k+1):D]);
endfunction

function [y] = spindices(a,k)
    s = size(a);
    n = s(k);
    D = length(s);
    x = permute(a,[k,1:(k-1),(k+1):D]);

    y = reshape(x,n,[]);
    y = spdiag(1:n) * spones(y);
    y = reshape(y,size(x));

    y = permute(y,[(2:k),1,(k+1):D]);
endfunction