我有一个大小为 N -by- 1 的列向量X
,其中包含两个值:10
和25
。我想切换这些值,即每个值为10
的元素应该变为25
,反之亦然。
的伪代码:
A = [ 10; 25; 25; 10; 25; 25; 10]
NewNew = find(A == 10)
NewNew2 = find(A == 25)
NewNew3 = [ ];
for NewNew3
if NewNew
NewNew=25
else NewNew2
NewNew2=10
end
我试过这个现在仍然没有成功:
for B = 1:size(A)
if A == 10
A = 25
elseif A == 25
A = 10
end
end
如何切换值?
答案 0 :(得分:3)
ActionFilter
您可以使用logical indexing执行此操作。只需确保获得单独的输出向量,因为设置N=10;
X = randi([1 2],N,1);
A = zeros(size(X)); % create output vector
A(X==2)=1; % whenever X==2, set A=1
A(X==1) = 2; % whenever X==1, set A=2
[X A]
ans =
1 2
2 1
2 1
1 2
2 1
1 2
1 2
2 1
2 1
2 1
将使整个向量X(X==1)=2
,然后调用2
将整个向量设置为X(X==2)=1
。如有必要,请在结尾处使用1
。
最后的建议:你的X=A
循环需要索引,这与MATLAB基本相同。您可以使用for
循环解决此问题,但我建议使用上述逻辑索引。我强烈建议您参加MATLAB的基础课程,或阅读the MathWork's own tutorial on MATLAB。
答案 1 :(得分:3)
如果您只有两个值,为什么不从它们的添加中减去:
A = 35 - A;
答案 2 :(得分:1)
您可以考虑其他一些选项。
1。)(不相关的选项。使用ibancg' s选项,更清洁,更快。) 如果您只有这两个值,那么更简单,更快速的解决方案是初始化为这两个数字中的一个,并只翻转一部分数字:
A = [ 10; 25; 25; 10; 25; 25; 10];
X = ones(size(A)) * 10; % initialize X with 10.
X(A == 10) = 25; % Set values where A is 10 to 25.
2。)(无关,太慢):如果你知道某些数字永远不会出现的另一种可能性是使用临时的第三个数字并避免创建一个新的矩阵 - 操作类似于典型的"交换两个号"配方
A(A == 10) = 1; % Temp value
A(A == 25) = 10;
A(A == 1) = 25;
3.)最后,第三个选项是保存逻辑矩阵,然后覆盖A。
Ais10 = A==10;
Ais25 = A==25;
A(Ais10) = 25;
A(Ais25) = 10;
现在,对于基准测试:我使用了非常简单的脚本,改变了N和M.
tic
for i = 1 : M
X1 = randi([1 2],N,1);
... % depends on test cases. Result can be in X or A.
toc
因此,它也是randi的时间,但由于它是每个代码的一部分,它应该只掩盖相对速度差异,保持绝对值相同。电脑是i7 4770k,32GB RAM。 行向量有1000个元素,1M运行; 100M元素,10次运行; 1B元素,1运行; 3B元素,1运行
依赖于只有2个值的代码:
代码依赖于缺少一个可用于交换的值:
代码处理任意数据,交换2个值。
因此,总而言之,Ibancg的选项比其他选项更快更简单,如果可能的话应该使用(=向量中只有2个不同的值)。我的第二个选择太慢而无法相关。而是使用任何一般方法逐步交换向量。一般选择都没问题。