基于整数值将矩阵拆分为单独的二进制矩阵-MATLAB

时间:2018-07-17 19:20:28

标签: matlab matrix split

m  = randi([1 4],4,4)

我想为每个唯一的整数创建单独的二进制矩阵:

mm{1} = m==1
mm{2} = m==2
mm{3} = m==3
mm{4} = m==4

使用四个不同的整数,上面的方法就可以了,但是我的原始矩阵具有这么多的唯一值,我想知道是否有一种更自动化的方法来实现这一点。

2 个答案:

答案 0 :(得分:3)

一个选择是创建一个3D logical矩阵,其中每个2D平面都是所需的二进制矩阵之一。假设要测试从1到m中找到的最大值的所有整数,则可以使用bsxfunimplicit expansion(在R2016b版本或MATLAB的更高版本中)执行此操作: / p>

N = max(m(:));

mm = bsxfun(@eq, m, reshape(1:N, [1 1 N]));
% or
mm = (m == reshape(1:N, [1 1 N]));  % Implicit expansion

现在,如果您想要m = 2的二进制矩阵,只需索引到mm

mat = mm(:, :, 2);

答案 1 :(得分:0)

如果您的唯一值不是连续的,则应使用unique来获取所有这些值:

[U, ~, upos] = unique(m);
umat = reshape(upos, size(m));
% Note that U(umat) == m.

现在,umat变得整洁,因为它具有连续的唯一整数值​​,您可以代替原始矩阵对其进行处理(使用gnovice的解决方案)。或者,您可以使用U代替此1:N,这也是他对“ matlab-y”方法的回答。 虽然,我可能会在这里使用循环。它不应有明显的性能差异。

现在,这种方法有一个问题-它经历了很多次矩阵。在这里,我可以想象一种解决方法:

foundInds = m(1);
logMats = cell(1);
logMats{1} = false(size(m));
for i = 1 : numel(m)
    anyFound = false;
    for j = 1 : length(foundInds)
       if (m(i) == foundInds(j))
          anyFound = true;
          logMats{j}(i) = true;
          break;
       end
    end
    if ~anyFound
       % Add the new element.
       foundInds(end+1) = m(i);
       logMats{length(foundInds)} = false(size(m));
       logMats{length(foundInds)}(i) = true;
    end
end

(您至少需要通过不对每个新元素更改foundIndslogMats的大小来使它变得愚蠢),只需对唯一元素的数量进行初步猜测即可。

但是,尽管代码只经历了元素一次并且完成了理论上所需的最少工作量……在当前形式下,它根本无法正常工作-如果您有大量的代码,它只能胜过gnovice的解决方案可能的值,但矩阵很小(unique在这里效果最好)。