gpt4 book ai didi

matlab - 使用 accumarray 输出矩阵

转载 作者:太空宇宙 更新时间:2023-11-03 20:23:28 24 4
gpt4 key购买 nike

MATLAB 的 accumarray在许多应用程序中具有令人难以置信的强大功能。我的问题是,应用于输入的 accumarray 函数具有三个输出,而 accumarray 只能处理标量输出。例如,我想做这样的事情:

subs = [1;2;4;2;4;5];
vals = [1;1;1;2;5;1];
accumarray(subs, vals, [], @(x)[min(x),mean(x),max(x)],0)

并让 accumarray 返回:

1.0000    1.0000         0    1.0000    1.0000
1.0000 1.5000 0 3.0000 1.0000
1.0000 2.0000 0 5.0000 1.0000

我想我可以只运行 accumarray 三次,但是我的函数很慢,运行一次 accumarray 比运行三次要快得多。我刚刚在这里被冲洗了吗?

最佳答案

您可以作弊使匿名函数输出元胞数组 而不是单个值。这样,accumarray 将为您提供矩阵元胞数组。完成后,您可以将所有矩阵连接成一个矩阵。请注意,您建议的匿名函数将 minmaxmean 作为行向量,但您的预期结果是 column 矢量。因此,我已将其转置到您的匿名函数中。

我们必须考虑的陷阱是填充值。您指定的填充值需要是标量。因此,您可以通过省略它来作弊,但是您的输出现在将在单元格中包含空矩阵,而不是结果行填充 0。解决此问题的一种方法是找到所有空单元格,将它们替换为一排零,然后在完成后将它们拼凑在一起。要确定 accumarray 输出的哪些行将为空,您可以使用 cellfun结合 isempty所以我们可以看到结果中的哪些元素是空的。一种更简洁的方法是首先预先分配一个 zeros 矩阵,然后只填充与 accumarray 输出中的非空位置相对应的行完成它:

subs = [1;2;4;2;4;5];
vals = [1;1;1;2;5;1];
out = accumarray(subs, vals, [], @(x){[min(x),mean(x),max(x)].'});
ind_empty = cellfun('isempty', out);
out_final = zeros(3, numel(out));
out_final(:, ~ind_empty) = cat(2, out{:});

注意 cat 的使用这是在指定的维度上将矩阵连接在一起。执行 out{:} 会产生所谓的 comma-separated list所以它相当于获取 accumarray 输出的每一列,并将它们作为单独的参数放入 cat 中,以便我们最终将所有列拼凑成一个矩阵,但我以这样的方式切入输出,我们只填充那些不为空的位置。

根据您的测试输入,我会匹配您得到的结果:

>> out_final

out_final =

1.0000 1.0000 0 1.0000 1.0000
1.0000 1.5000 0 3.0000 1.0000
1.0000 2.0000 0 5.0000 1.0000

但是,老实说 - 如果您确定只有三个值要分装到 accumarray 中,那么简单地调用它三次然后连接起来可能会更快完成后的一切。我会争辩说它更具可读性,并且可以非常清楚地说明您在做什么。按照我对上面的元胞数组所做的方式进行操作需要您真正了解 MATLAB 的工作原理。

关于matlab - 使用 accumarray 输出矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42723800/

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