从matlab中的线性索引获取相邻索引

时间:2018-05-24 09:48:48

标签: matlab matrix indexing

给定一组矩阵的线性索引,我怎样才能得到它的相邻索引?通过相邻,我指的是索引的左侧,右侧,顶部,底部或对角线位置的索引。

例如,给定一个4 * 5矩阵

B = [1 0 0 0 0;
     1 1 0 1 1;
     0 0 1 0 1;
     1 0 1 0 0;]

和B [1,2,4,6,11,12,14,18,19]的线性指数(它对应于非零熵的指数),我怎样才能选择只有至少有一个邻居?在这种情况下,我的输入是

[1, 2, 4, 6, 11, 12, 14, 18, 19]

我希望输出为

[1, 2, 6, 11, 12, 14, 18, 19]

除了4之外,所有其他人在索引集中都有邻居。

2 个答案:

答案 0 :(得分:3)

您可以使用2D卷积计算每个条目的非零邻居数,并将其用作逻辑掩码:

var proto = {};
Object.defineProperty(proto, "key", {
    get: function () { return 123; }
});

var obj = Object.create(proto);

console.log(obj); // {}
console.log(Object.getOwnPropertyNames(obj)); // []
console.log(obj.key); // 123

答案 1 :(得分:0)

图像处理工具箱中的bwconncomp函数返回二进制图像中的连通分量。由于您的矩阵是二进制图像,即包含0和1的2-D矩阵,我们可以使用它。

调用函数

>> CC = bwconncomp(B);

返回包含(以及其他字段)PixelIdxList的结构,该结构是一个单元数组,其中每个元素是对应于特定连接组件的像素索引数组。在您的情况下,这是:

>> CC.PixelIdxList

ans =

  1×2 cell array

    {8×1 double}    {[4]}

所以你有两个连通的组件:一个由8个像素组成,索引由CC.PixelIdxList{1}给出,第二个包含1个像素,索引为4

由于您要删除所有没有邻居的像素,您可以检查CC.PixelIdxList的所有元素的元素数量,并仅使用一个元素删除所有元素:

>> numPixels = cellfun(@numel,CC.PixelIdxList);
>> toRemove = (numPixels == 1);

这为我们提供了一个数组toRemove,其中包含我们要保留的每个连接组件的0,以及我们要删除的每个连接组件的1。最后,您可以使用

将要保留的所有连接组件连接到一个阵列中
>> allIdx = CC.PixelIdxList(~tooSmall);
>> allIdx = allIdx{:};

给我们留下了理想的结果

>> allIdx

allIdx =

     1
     2
     6
    11
    12
    14
    18
    19