我有一个大小为10x100的矩阵A,如下所示。我想做的是:
示例:
A = [ 0 0 0 2 4 1 0 0 0 1 3 2;
0 0 0 5 1 1 1 1 0 0 0 1;
0 3 4 1 0 3 1 2 0 0 1 3;
0 0 0 0 1 3 4 5 0 0 0 0];
对于第一行,中间值是5和11,等等,所以如果有人可以建议我如何用最少的处理来完成这个任务,因为可以使用循环来完成,但是如果有更有效的方法来完成呢?如果需要澄清,请告诉我。
发布于 2013-08-02 08:47:06
现在你澄清了你的问题(再次.)这里有一个解决方案(仍然使用for循环.)。它包括“规则7”--不包括少于三个元素的运算;它还包括该规则的第二部分--少于三个零的运算不算作零。新代码如下所示:
A = [ 0 0 0 2 4 1 0 0 0 1 3 2;
0 0 0 5 1 1 1 1 0 0 0 1;
0 3 4 1 0 3 1 2 0 0 1 3;
0 0 0 0 1 3 4 5 0 0 0 0];
retVal = cell(1, size(A, 1));
for ri = 1:size(A,1)
temp = [1 0 0 0 A(ri,:) 0 0 0 1]; % pad ends with 3 zeros + 1
% so that is always a "good run"
isz = (temp == 0); % find zeros - pad "short runs of 0" with ones
diffIsZ = diff(isz);
f = find(diffIsZ == 1);
l = find(diffIsZ == -1);
shortRun = find((l-f)<3); % these are the zeros that need eliminating
for ii = 1:numel(shortRun)
temp(f(shortRun(ii))+1:l(shortRun(ii))) = 1;
end
% now take the modified row:
nz = (temp(4:end-3)~=0);
dnz = diff(nz); % find first and last nonzero elements
f = find(dnz==1);
l = find(dnz==-1);
middleValue = floor((f + l)/2);
rule7 = find((l - f) > 2);
retVal{ri} = middleValue(rule7);
end
返回值必须使用单元格数组,因为您不知道每行将返回多少个元素(根据更新的需求)。
上面的代码返回以下单元格数组:
{[5 11], [6], [7], [7]}
我似乎仍然不理解您的“规则7",因为您说”第3行中没有列满足此条件“。但在我看来,一旦我们消除了短距离的零,它就做到了。除非我误解了您想要处理的非零数的运行,并一直到边缘(我假设这是好的-这就是为什么您返回11
作为一个有效的列在第1行;那么,您为什么不返回7
的第3行?)
发布于 2013-08-02 09:08:05
试试这个:
sizeA = size(A);
N = sizeA(1);
D = diff([zeros(1, N); (A.' ~= 0); zeros(1,N)]) ~= 0;
[a b] = find(D ~= 0);
c = reshape(a, 2, []);
midRow = floor(sum(c)/2);
midCol = b(1:2:length(b))
在此之后,midRow和midCol包含您的质心的指数(例如,对于上面给出的示例矩阵,midRow(1) = 1,midCol(1) =4)。
发布于 2013-08-02 08:24:55
如果您不介意使用for
循环:
A = [ 0 0 1 1 1 0 1;
0 0 0 0 0 0 0;
0 1 1 1 1 0 0;
0 1 1 1 0 1 1;
0 0 0 0 1 0 0]; % data
sol = repmat(NaN,size(A,1),1);
for row = 1:size(A,1)
[aux_row aux_col aux_val] = find(A(row,:));
if ~isempty(aux_col)
sol(row) = aux_col(1) + floor((find(diff([aux_col 0])~=1,1)-1)/2);
% the final 0 is necessary in case the row of A ends with ones
% you can use either "floor" or "ceil"
end
end
disp(sol)
试试,看看它能不能做你想做的事。我希望代码是清楚的,如果没有,请告诉我
https://stackoverflow.com/questions/18021158
复制相似问题