gpt4 book ai didi

matlab - 如何在不明确列出它们的情况下保留指定尺寸之后剩下的所有尺寸?

转载 作者:太空宇宙 更新时间:2023-11-03 19:09:01 27 4
gpt4 key购买 nike

或等效地,“Matlab 中 NumPy 的省略号索引等效于什么”

假设我有一些高维数组:

x = zeros(3, 4, 5, 6);

我想编写一个函数,它接受一个大小为 (3, ...) 的数组,并进行一些计算。在 NumPy 中,我可以这样写:

def fun(x):
return x[0]*x[1] + x[2]

但是,MATLAB 中的等效项不起作用,因为使用一个整数进行索引会将数组展平为 1d

function y = fun_bad(x)
y = x(1)*x(2) + x(3)

我可以用 3 维数组来完成这项工作

function y = fun_ok3d(x)
y = x(1,:,:)*x(2,:,:) + x(3,:,:)

如果我希望它适用于最多 10 维的数组,我可以这样写

function y = fun_ok10d(x)
y = x(1,:,:,:,:,:,:,:,:,:)*x(2,:,:,:,:,:,:,:,:,:) + x(3,:,:,:,:,:,:,:,:,:)

我怎样才能避免在这里写下愚蠢的冒号,并让它适用于任何维度?是否有一些 x(1,...) 语法暗示了这一点?

NumPy 可以在索引表达式中使用 ...(Ellipsis)文字来表示 ": 的次数与需要”,这将解决这个问题。

最佳答案

方法 1:使用逗号分隔列表和 ':'

我不知道如何指定

: as many times as needed

同时保持形状。但是你可以指定

: an arbitrary number of times

其中该次数是在运行时定义的。使用此方法,您可以保留形状,前提是索引的数量与维度的数量一致。

这是使用 comma-separated list 完成的从元胞数组生成,并利用 the string ':' can be used as an index instead of : 的事实:

function y = fun(x)
colons = repmat({':'}, 1, ndims(x)-1); % row cell array containing the string ':'
% repeated the required number of times
y = x(1,colons{:}).*x(2,colons{:}) + x(3,colons{:});

这种方法可以很容易地推广到沿任何维度建立索引,而不仅仅是第一个维度:

function y = fun(x, dim)
% Input argument dim is the dimension along which to index
colons_pre = repmat({':'}, 1, dim-1);
colons_post = repmat({':'}, 1, ndims(x)-dim);
y = x(colons_pre{:}, 1, colons_post{:}) ...
.*x(colons_pre{:}, 2, colons_post{:}) ...
+ x(colons_pre{:}, 3, colons_post{:});

方法二:分割数组

您可以使用 num2cell 沿第一个维度拆分数组,然后将操作应用于生成的子数组。当然这会占用更多内存;和 noted by @Adriaan它比较慢。

function y = fun(x)
xs = num2cell(x, [2:ndims(x)]); % x split along the first dimension
y = xs{1}.*xs{2} + xs{3};

或者,对于沿任何维度的索引:

function y = fun(x, dim)
xs = num2cell(x, [1:dim-1 dim+1:ndims(x)]); % x split along dimension dim
y = xs{1}.*xs{2} + xs{3};

关于matlab - 如何在不明确列出它们的情况下保留指定尺寸之后剩下的所有尺寸?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42485787/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com