我试图翻转矩阵的某些部分。我可以通过例子更好地解释。假设我有一个矩阵
M = [ 1 3 6;
1 2 4;
1 7 1;
2 9 0;
2 8 3;
2 4 2;
2 3 1;
3 6 5;
3 4 5;
3 1 9;
4 2 4;
4 8 6 ]
我想在这里做的是在第一列中取任何带偶数的行,然后翻转第三列元素。最终结果如下:
1 3 6
1 2 4
1 7 1
2 9 1 *
2 8 2 *
2 4 3 *
2 3 0 *
3 6 5
3 4 5
3 1 9
4 2 6 *
4 8 4 *
请注意,标有星号的行已将第三列的元素翻转过来。我遇到的问题是像for循环一样遍历每一行,你无法翻转整行。
提前感谢您的帮助。
答案 0 :(得分:4)
另一个时间accumarray
是要走的路:
A =[ 1 3 6 ;
1 2 4 ;
1 7 1 ;
2 9 0 ;
2 8 3 ;
2 4 2 ;
2 3 1 ;
3 6 5 ;
3 4 5 ;
3 1 9 ;
4 2 4 ;
4 8 6 ]
C = accumarray(A(:,1),A(:,3),[],@(x) {flipud(x)} ); %// get groups according to
%// first column and flip it
C = vertcat(C{:}); %// cell array returned,
%// transform to matrix
mask = ~mod(A(:,1),2); %// mask for even numbers
A(mask,3) = C(mask); %// replace masked values of 3rd column with flipped ones
返回:
A =
1 3 6
1 2 4
1 7 1
2 9 1
2 8 2
2 4 3
2 3 0
3 6 5
3 4 5
3 1 9
4 2 6
4 8 4
肯定比较慢,但仅仅是为了两行中的乐趣:
C = accumarray(A(:,1),A(:,3),[],@(x) {flipud(x)} );
A(~mod(A(:,1),2),3) = getfield( vertcat(C{:}), {~mod(A(:,1),2)});
%// well no, I won't explain it...
编辑:我假设你的第一列只包含整数!
答案 1 :(得分:0)
我建议你将问题分解为几个阶段,如下所示:
您可以使用unique
和mod
函数识别一组偶数,然后对它们使用for循环,并使用逻辑索引来拉取/替换块。
答案 2 :(得分:0)
在这里,试试这个
a = magic(5); % Some data in a 5x5 matrix
b = 1:numel(a); % Indices of <a>
然后根据需要重新排列b,然后根据重新分配的b索引a=a(b)
重新分配a。例如,以下代码
disp(a(b));
只会以原始顺序返回a的元素。对于您的应用程序,此代码应该有效:
a = <your matrix data>
b = 1:numel(a);
b = [b(1:27) fliplr(b(28:31)) b(32:34) fliplr(b(35:36))] % Change this part
a = reshape(a(b),size(a))
你应该根据你需要做的事情来改变b。