【问题标题】:Remove columns from a matrix after performing a computation执行计算后从矩阵中删除列
【发布时间】:2014-04-02 06:20:52
【问题描述】:

假设我有一个包含 10 个值的矩阵 A。

这些值中的每一个都存在于单独的单元格中:

A = [A{1}, A{2}, A{3}, A{4}, A{5}, A{6}, A{7}, A{8}, A{9}, A{10}

假设我对这个矩阵应用了一个奇怪的虚构函数(奇怪,请不要太担心这个函数实际上做了什么!;))最终给了我 10 个不同的值:

B = strangef(A);
B(1,:) = [1.3, 4.2, 1.0, 2.3, 6.4, 0.9, 4.5, 2.6, 7.1, 3.1]

然后我寻找B中的最小值:

c = find(B==min(min(B)))

我发现它是 A 的第 6 个值,所以现在我想重建我的矩阵,使其排除第 6 个值,如下所示:

A = [A{1}, A{2}, A{3}, A{4}, A{5}, A{7}, A{8}, A{9}, A{10}]

我可以使用如下索引构造这个新矩阵:

col = 10; %number of columns
index = setdiff(1:col, c);

但是,虽然我可以在循环的第一次迭代中使用 c(列值),但如果此新矩阵的最小值为 A{3},则我的新矩阵缺少一个值,但此新矩阵中的列值具有只有 9 列是 2。

因此我实际上最终创建了这个矩阵:

A = [A{1}, A{3}, A{4}, A{5}, A{7}, A{8}, A{9}, A{10}]

而不是这个:

A = [A{1}, A{2}, A{4}, A{5}, A{7}, A{8}, A{9}, A{10}]

这是一些伪代码

excludingMinimums = [];
col = 10;

while col>1
      index = setdiff(1:col,excludingMinimum)
      for i = 1:col
          A = [A{i}]
      end
      B = strangef(A)
      c = find(B==min(min(B)))
      excludingMinimums = [excludingMinimums, c]
      col = col - 1; 
end

【问题讨论】:

  • 问题,是的,它与“strangef”有关-如果我们在每次运行该函数后将NaNs 引入A,那会是个问题吗?这会影响B = strangef(A); 的结果吗,除了B 中的对应元素也会是NaN?这会影响B 中的其他值吗?

标签: matlab matrix


【解决方案1】:

不如这样:保留一个正在缩小的 A 的运行副本。删除比使用丢失的元素重建更容易。

while size(A,2)>1
    B = strangef(A);
    c = find(min(min(B)));
    A(c) = [];   % delete the element from A
    excludingMinimums = [excludingMinimums c];  % save this vector for future output?
end

注意() 表示法删除,即使A 是一个单元格。

【讨论】:

    【解决方案2】:

    逻辑索引比您想象的要简单得多:

    B = strangef(A);
    A = A(:, B~=min(B));
    

    我们可以类似地跟踪剩余的列:

    col = 1:size(A,2);
    while length(col)>1
        B = strangef(A);
        idx = (B == min(B));
        col = col(idx);
        A = A(:, ~idx);
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-08
      • 2013-07-22
      • 2021-11-14
      • 1970-01-01
      • 1970-01-01
      • 2013-05-12
      • 2016-05-26
      相关资源
      最近更新 更多