1

我有一个大数组,比如 A,其值在 {1,...,n} 中,还有另一个大小相同的数组 B。

我想获得以下所有内容:

B(A==1)
B(A==2)
...
B(A==n)

然后对结果做其他事情(现在不那么重要)。

我试过这样的事情:

[x,y] = B(A==[1:n])

[x,y] = [B(A==1), B(A==2), ..., B(A==n)]

当然无济于事。

for 循环方法

for ii=1:n
    dummy=B(A==1)
    other stuff
end

有效,但我确信我可以避免 MATLAB 中所有内容的 for 循环!不过,卡在这里。有什么建议么?也许某种内联匿名函数调用?

4

2 回答 2

2

arrayfun是你的朋友,希望你能看到如何修改它以供自己使用:

A=randi(5,10,10)
B=rand(10)
C=arrayfun(@(i) B(A==i),1:5,'UniformOutput',false)
C{1} % for example, gives B(A==1)

C是一个元胞数组。

请注意,for对于较大的问题,循环可能会更快。做一些测试看看是否arrayfun真的更快是个好主意。查看这个问题及其答案以了解更多信息。可能有一些方法可以在不使用的情况下做到这一点arrayfun,但我想不出!

于 2014-05-21T02:46:53.490 回答
1

假设A是一个向量数组,您可以为 A 中的每个元素创建一个二进制比较矩阵,将其与 [1:n] 的向量进行比较,其中 n 是 A 中的最大元素 -

indx_mat = bsxfun(@eq,A,1:max(A))

接下来,每当您需要根据比较访问 B 中的某些元素时,您可以使用特定的列来indx_mat代替。例如,如果您需要访问 的元素B(A==2),请使用B(indx_mat(:,2))

于 2014-05-21T06:55:04.850 回答