Arrays 基于matlab的矢量数组生成
我有3个向量x,y和z。如何创建一个数组a,使a(I,j,k)=[x(I),y(j),z(k)] 我试过了Arrays 基于matlab的矢量数组生成,arrays,matlab,Arrays,Matlab,我有3个向量x,y和z。如何创建一个数组a,使a(I,j,k)=[x(I),y(j),z(k)] 我试过了 a(:,:,1) = [[1,2];[3,4]] 但是得到 Subscripted assignment dimension mismatch. 评论后编辑 基本上,我第一次想从x,y,z创建一个数组a,但这里是我的原始问题(所以我认为创建一个向量会更好): 我有三个向量:x,y,z,假设x=[1,2,3],y=[4,3,2]z=[1,3,2] 我想计算每个[x_I,y_j,z_k]上
a(:,:,1) = [[1,2];[3,4]]
但是得到
Subscripted assignment dimension mismatch.
评论后编辑
基本上,我第一次想从x,y,z创建一个数组a,但这里是我的原始问题(所以我认为创建一个向量会更好):
我有三个向量:x,y,z,假设x=[1,2,3],y=[4,3,2]z=[1,3,2]
我想计算每个[x_I,y_j,z_k]上的高斯概率函数
我在考虑使用数组。因此,我首先尝试将mvnpdf与数组a结合使用:
a = rand(3,3,3) < 0.1
显然,他不喜欢我使用数组
你知道我如何计算我想要的吗(除了使用循环,循环对于我的实向量x,y,z的大小来说太长了)。你可以这样做:
x = [10 20 30 40 50]; % example x
y = [100 200 300 400]; % example y
z = [1000 2000 3000]; % example z.
[ii jj kk] = ndgrid(1:length(x), 1:length(y), 1:length(z));
a = cat(4, x(ii), y(jj), z(kk));
生成的a
是一个大小为length(x)
xlength(y)
xlength(z)
x3
的四维数组。第四维是指所需向量的三个元素。所以你想要的结果[x(i),y(j),z(k)]
将由a(i,j,k,:)
给出,或者更确切地说是挤压(a(i,j,k,:)。
。比如说,
>> squeeze(a(1,2,3,:)).'
ans =
10 200 3000
根据您的评论,并感谢@chappjc:如果您希望所有这些向量按字典顺序堆积成三列矩阵的行,只需使用:
[kk jj ii] = ndgrid(1:length(z), 1:length(y), 1:length(x));
b = [x(ii(:)).' y(jj(:)).' z(kk(:)).'];
结果:
>> b(1,:)
ans =
10 100 1000
>> b(2,:)
ans =
10 100 2000
等等。你想让a(i,j,k)成为一个向量吗?a=[x(:)y(:)z(:)]做你想做的吗?似乎
mvnpdf(a,…)
需要第一个输入参数a
为N-by-D
@chappjc,这并不是因为我想计算所有组合x(I),y(j),z(k)的mvnpdf(我想你的解决方案只会给我x(I),y(I),z(I)的mvnpdf)是吗?是的,我现在明白了。路易斯的答案对所有组合都很好。@teaLeef-如果你明确说明了x,y,z在输出N-by-D
矩阵中的变化顺序,那会很有帮助。a(1,2,3,:)仍然是一个4-D数组。还有什么方法可以代替向量吗?(因为我使用数组时从mvnpdf得到的错误)?谢谢,请看我的答案。squage(a(1,2,3,:)
是列向量,squage(a(1,2,3,:)。
是行向量。@teaLeef注意,使用meshgrid
而不是ndgrid
会给出错误的结果。例如,对于我的示例数据squage>squage(a(2,4,3,:))
将给出402003000,这是错误的。因此ndgrid
是正确的方法。@teaLeef我现在明白了。试试b=[x(ii(:)y(jj(:)z(kk(:)];
。检查结果order@teaLeef-如果您决定以不同的方式使用它,您可以随时通过对ndgrid
的输入/输出重新排序来更改顺序,记住第一个输入/输出对变化最快,然后是第二个,以此类推。这就是为什么ndgrid
比meshgrid
IMO更直观的原因这都是我的,答应我!
>> b(1,:)
ans =
10 100 1000
>> b(2,:)
ans =
10 100 2000