【问题标题】:Generating a HeatMap from a Three Dimmensional Cell从三维单元生成热图
【发布时间】:2014-10-08 10:21:01
【问题描述】:

我有一个 192x256x192 的单元格,其中每个单元格都是一个 13 条目长的向量。我的任务是在每张地图中创建 192 个 192x256 方格的热图。每个正方形的值应该是作为 13 条目长向量的指数拟合的 b 值。

即Cell{:,:,1} 是一个图像。单元格{1,1,1} 表示像素随时间经历的 13 次强度变化。我想制作 192 个热图,其中热图上的每个点都是指数拟合的 b 值,以适应像素随时间的强度变化。

我有一些代码(见下文),但我不是一个优秀的程序员,它运行得非常慢。有人对这样做的替代方法有建议吗?或有关此主题的建议。

谢谢。

ExpHeatMap = zeros(192,256,192);
t = 1:13;
ft=fittype('exp1');

for i = 1:192

    for j = 1:256

        for k = 1:192

            testArray = HeatMapValues{k,j,i}(1:end);
            numZeros = find(testArray == 0);

            if numZeros > 10

                ExpHeatMap(k,j,i) = 0;

            else

                cf = fit(t',HeatMapValues{k,j,i}',ft);
                ExpHeatMap(k,j,i) = cf.b;

            end

        end

    end

end

【问题讨论】:

  • 您可以使用 cellfun mathworks.co.uk/help/matlab/ref/cellfun.html 加速它
  • 只有两个小技巧。首先,testArray 中的最后一个索引是不必要的,即testArray = HeatMapValues{k,j,i};。其次,我认为你可以把对find的调用改成numZeros = find(testArray == 0, 1, 'first');
  • ExpHeatMap(k,j,i) = 0; 行由于预分配而冗余。
  • this solution 对这个问题有什么好处吗?

标签: performance matlab indexing heatmap cell-array


【解决方案1】:

这是基于cellfun 的无循环方法-

fv = cellfun(@(x) getfield(fit(t(:),x',ft),'b'), HeatMapValues);
ExpHeatMap = fv.*reshape(~(sum(vertcat(HeatMapValues{:}),2)>10),...
                                                 size(HeatMapValues))

我认为加速过程的大部分仍然取决于您如何矢量化 fit 计算。 cellfun 是避免for-loops 的一种方法,但它并不一定会大大加快计算速度。但我认为它不会比for-loop 方法慢。

【讨论】:

  • 这似乎更快,但我不断收到这个错误,这对我来说毫无意义,因为我输入的所有内容都是列向量。 “使用 fit>iFit 时出错(第 133 行)Y 必须是列向量。”
  • @odnanreh12 你能试试编辑后的代码吗?它现在必须适用于任何类型的矢量,如t
【解决方案2】:

我首先建议使用 ii、jj 和 kk 代替 i、j 和 k。 接下来,我建议您像为ExpHeatMap 所做的那样预先分配变量testArray。 另外,不应该是 {i, j, k} 而不是 {k, j, i} 吗?

【讨论】:

  • 感谢您的建议,一些问题(我对 MatLab 比较陌生,所以请原谅我的无知):我一直看到它,但为什么人们使用 ii、jj 和 kk 而不仅仅是单个字母?这只是约定俗成的问题吗?至于其他评论,最后这并不重要,但我这样做是因为我希望它是逐个图像完成的,而 {i,j,k} 将是每个图像的第一个像素,然后是每个图像的第二个像素,等等。只是我为谁知道为什么做出的一个奇怪的选择。
  • @odnanreh12 ij 指的是 MATLAB 中的虚数单位。参考这个link
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-19
  • 2011-08-01
  • 2011-10-23
  • 2020-11-04
  • 1970-01-01
  • 2014-12-01
  • 1970-01-01
相关资源
最近更新 更多