【问题标题】:Using accumarray to output a matrix使用 accumarray 输出矩阵
【发布时间】:2017-08-01 02:49:48
【问题描述】:

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 会比运行三次要快得多。我是不是刚被冲到这里?

【问题讨论】:

  • 您也可以使用统计工具箱中的grpstats,或者如果您有许可证,也可以使用图像处理工具箱中的regionprops
  • @rahnema1, min/mean/max 只是一个具体的例子来证明我的问题。我对 accumarray 的实际功能与 min/mean/max 完全不同,所以 grpstats 对我没有帮助。我每天都使用 regionprops,但我不知道你在描述什么。
  • 您可以使用 regionprops 来查找区域的统计属性。用法:stats = regionprops(subs, vals,'MaxIntensity','MeanIntensity','MinIntensity')。正如您所说,您的 accumarray 实际函数与 min/mean/max 完全不同,因此 regionprops 也无济于事。

标签: matlab matrix accumarray


【解决方案1】:

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

我们必须考虑的问题是填充值。您指定的填充值必须是标量。因此,您可以通过忽略它来作弊,但是您的输出现在将在单元格中包含空矩阵,而不是结果的行被填充为 0。解决此问题的一种方法是找到所有为空的单元格,将它们替换为一行零,然后在完成后将它们拼凑在一起。要确定accumarray 输出中的哪些行将是空的,您可以使用cellfunisempty 组合,这样我们就可以看到结果中的哪些元素是空的。一个更简洁的方法是首先预先分配一个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,那么简单地调用它 3 次然后连接所有值可能会更快完毕。我认为它更具可读性,并且可以非常清楚地说明您在做什么。像我对上面的元胞数组所做的那样,需要您真正了解 MATLAB 的工作原理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 2018-05-12
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    相关资源
    最近更新 更多