在倍频程/matlab中求指数矩阵
给定倍频程/Matlab中的多维矩阵A 得到与a相同大小的矩阵的最简单方法是什么?所有元素都被它们在第k维上的索引替换 黑客帝国在倍频程/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 得到另一个相同
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