【问题标题】:construct a matrix by removing different elements from an array without loops in matlab在matlab中通过从没有循环的数组中删除不同元素来构造矩阵
【发布时间】:2018-01-13 15:51:52
【问题描述】:

给定一个大小为 160*1 的离散正整数向量 X 和一个大小为 40*200 的表 Tb1,其中包含要从 X 中删除的索引列表 200 列中的每一列在Tb1 中指向要从原始X 中删除的40 个元素。

我通过使用具有 200 次迭代的 for 循环创建剩余 120*200 元素的新矩阵,在回合 i 根据列出的索引从原始 X 的副本中删除 40 个元素Tb1(:,i),但是太费时间和内存了。

如何在不使用循环且操作次数最少的情况下获得结果?

【问题讨论】:

  • 我看不到如何通过从数组中删除某些东西来获得矩阵
  • 请详细说明您的问题,添加示例代码,并澄清前面关于数组如何变成矩阵的评论。
  • 似乎下面的答案适合您的需求

标签: arrays matlab for-loop matrix


【解决方案1】:

这里有不同的方法:

方法一:

idx = ~hist(tbl, 1:160);
[f,~]=find(idx);
result1 = reshape(M(f),120,200);

方法二:

idx = ~hist(tbl, 1:160);
M2=repmat(M,200,1);
result2 = reshape(M2(idx),120,200);

方法 3 & 4:

% idx can be generated using accumarray
idx = ~accumarray([tbl(:) reshape(repmat(1:200,40,1),[],1)],true,[160,200],@any);
%... use method 1 and 2

方法5:

M5=repmat(M,200,1);
M5(bsxfun(@plus,tbl,0:160:160*199))=[];
result5 = reshape(M5,120,200);

假设M 是一个整数数组,tbl 是索引表。

可以用以下数据进行测试:

M = rand(160,1);
[~,tbl] = sort(rand(160,200));
tbl = tbl(1:40,:);

但是,如果您生成要保留的元素的索引而不是要删除的元素的索引,则效率会更高。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-20
    相关资源
    最近更新 更多