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});
我有一个名为 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});