【问题标题】:Condition execute for different columns in each row对每行中的不同列执行条件
【发布时间】:2015-05-18 21:59:00
【问题描述】:
A = [0,0,1,0,1,0,1,0,0,0;
     0,0,0,0,1,0,1,0,0,0;
     0,0,1,0,1,0,1,0,0,0];

B = [2,5;
     1,6;
     3,10];

预期的输出元胞数组:

C = [1,1,1,1;            %// 2-3-4, 3-4-5, 4-5, 5
     0,0,1,1,1,0;        %// 1-2-3, 2-3-4, 3-4-5, 4-5-6, 5-6, 6
     1,1,1,1,1,0,0,0];   %// 3-4-5, 4-5-6, 5-6-7, 7-8-9, 8-9-10, 9-10, 10

矩阵 B 包括应该使用哪些列来执行矩阵 A 上的条件。例如,B 的第一行是 2 和 5;所以应该使用矩阵 A 的第 2 5 列之间的元素来执行条件。 B的第二行是1和6;所以应该使用第 1 6 列之间的元素来执行条件。等等……

条件:如果连续3个元素之和大于或等于1,则将1写入矩阵C;否则写 0。例如,A 包括 0,1,0 作为三个连续元素(和为 0+1+0=1),因此将 1 写入矩阵 C。再例如,A 在第二行的前三个元素为 0 ,0,0(总和为 0),所以将 0 写入矩阵 C。以此类推...

“有时可以认为只有 1 或 2 个连续元素。”

例如,A 的第一行条件执行以第 5 列结束,因此只应考虑第 5 列的值;即 1。所以 1 被写入矩阵 C。

解释C的第一行:

1, 因为(A(1,:) 的 2,3,4 个元素之和)>= 1

1, 因为(A(1,:) 的 3,4,5 个元素之和)>= 1

由于最大限制为 5,因此此处仅采用 2 个连续元素
1,因为(仅 A(1,:) 的 4,5 个元素的总和)>= 1

由于最大限制为 5,因此此处仅采用 1 个连续元素
1,因为(仅 A(1,:) 的第 5 个元素的总和)>= 1

没有for循环,只有矩阵运算,我怎么能完成这个复杂的任务?还是什么技巧?

【问题讨论】:

  • "(和为 0+1+0=1),所以将 1 写入矩阵 C",为什么?你说总和应该大于大于1。我猜你的意思是大于等于1而不是“大于1”
  • 你是怎么得到矩阵C的?另外,您如何定义连续元素,逐行,逐列?例如,在第一行,第 2 到 5 列,你得到矩​​阵 C 中的 [1;1]。你如何得到接下来的两个 1?
  • @ParagS.Chandakkar 是的,它应该大于等于 1。
  • @ParagS.Chandakkar 按行排列。第三个 1 是第一行 (0,1) 的两个连续元素的结果,第四个 1 是第一行 (1) 的一个连续元素的结果。考虑到我只能在第一行的第 5 个元素(即矩阵 B)之前执行该条件。
  • 感谢@Santhan 的编辑,现在问题更清楚了。

标签: matlab matrix indexing


【解决方案1】:

使用mat2cellcellfunim2colany

subMatLen = 3;

%// Converting both A & B matrix to Cell Arrays to perform operations Row-wise
AC = mat2cell(A,ones(1,size(A,1)),size(A,2));
BC = mat2cell(B,ones(1,size(B,1)),size(B,2));

%// Getting only the columns of each rows within the limits specified  by Matrix B
%// Also appended with zeros for my own convenience as it wont affect the 'summing' process
out = cellfun(@(x,y) [x(y(1):y(2)),zeros(1,subMatLen-1)],AC, BC, 'uni', 0);

%// Finally taking each 1x3 sliding sub-matrix and returning 1 if `any` of it is non-zero
%// which is equivalent to summing and checking whether they are >= 1
out = cellfun(@(x) any(im2col(x, [1,subMatLen], 'sliding')), out, 'uni', 0);

您的示例输入:

A = [0,0,1,0,1,0,1,0,0,0;
     0,0,0,0,1,0,1,0,0,0;
     0,0,1,0,1,0,1,0,0,0];

B = [2,5;
     1,6;
     3,10];

输出:

>> celldisp(out)

out{1} =

 1     1     1     1


out{2} =

 0     0     1     1     1     0


out{3} =

 1     1     1     1     1     0     0     0

如果您希望它们作为单行或单列矩阵,您可以将其添加到代码底部:

out = cat(2,out{:})

out = (cat(2,out{:})).'

【讨论】:

  • 写这个问题的时候,没想到会有人回答。谢谢@Santhan。有用。如何将连续元素编号设为变量(在问题中为 3)。在我的代码中,当我将 3 更改为 6 时,在代码的最后一行,结果矩阵不正确。
  • @oarar,我很高兴它有帮助。编辑了我的代码..您不必编辑代码。只需更改顶部的subMatLen。它应该工作:)
猜你喜欢
  • 1970-01-01
  • 2018-11-28
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-22
  • 1970-01-01
  • 2020-10-01
相关资源
最近更新 更多