matlab中的结构操作

operations with structure in matlab

我有一个名为 struct 的 1x300 结构,其中包含 3 个字段,但我只使用了名为 way 的第三个字段。对于每 300 行,该字段是一个索引的 vertor。

这里有一个 3 行的例子来解释我的问题:我想搜索第一行的最后一个索引是否存在于字段 way.[=16 的另一个向量(行)中=]

way
[491751 491750 491749 492772 493795 494819 495843 496867]
[491753 491754 491755 491756]
[492776 493800 494823 495847 496867]

我试过相交函数:

Inter=intersect(struct(1).way(end), struct.way);

但是 Matlab returns 我出错了 :

Error using intersect (line 80)
Too many input arguments.

Error in file2 (line 9)
Inter=intersect(struct(1).way(end), struct.way);

我不明白为什么会出现此错误。任何解释 and/or 其他解决方案?

您可能想使用 ismember

考虑你传递给 intersect/ismember 函数的内容,struct.way 不是一个有效的参数,你可能需要循环遍历你的每一行结构(在这种情况下,使用元胞数组或具有等长行的矩阵会更容易)。

output = zeros(300);
for ii = 1:300
    for jj = 1:300
        if ii ~= jj && ismember(struct(ii).way(end), struct(jj).way)
            output(ii,jj) = 1;
        end
    end
end

现在您有一个矩阵 output,其中 1 的元素标识结构行 ii 中最后一个元素与向量 struct(jj).way 之间的匹配项,其中 ii 是矩阵行号,jj 是列号。

让数据定义为

st(1).way = [491751 491750 491749 492772 493795 494819 495843 496867];
st(2).way = [491753 491754 491755 491756];
st(3).way = [492776 493800 494823 495847 496867]; % define the data
sought = st(1).way(end);

如果您想知道哪些向量包含所需的值:将所有向量打包到一个元胞数组中,然后使用匿名函数将其传递给cellfun,如下所示:

ind = cellfun(@(x) ismember(sought, x), {st.way});

这给出:

ind =
  1×3 logical array
   1   0   1

如果您想知道每个向量匹配的索引:修改匿名函数以输出具有索引的单元格:

ind = cellfun(@(x) {find(x==sought)}, {st.way});

或等同于

ind = cellfun(@(x) find(x==sought), {st.way}, 'UniformOutput', false);

结果是:

ind =
  1×3 cell array
    [8]    [1×0 double]    [5]

或者,排除参考向量:

n = 1; % index of vector whose final element is sought
ind = cellfun(@(x) {find(x==st(n).way(end))}, {st([1:n-1 n+1:end]).way});