在MATLAB中用两个值替换向量值

时间:2015-05-01 16:55:19

标签: arrays matlab vector indexing assignment-operator

我必须创建一个函数,将一个向量v和三个标量abc作为输入。该函数使用两个元素数组v替换等于a的{​​{1}}的每个元素。

例如,给定[b,c]v = [1,2,3,4],输出将为:

a = 2, b = 5, c = 5

我的第一次尝试是尝试这个:

out = [1,5,5,3,4]

然而,我得到一个错误,所以我不明白如何将两个值放在向量中的一个位置,即将所有以下值移到一个位置向右,以便新的两个值适合向量因此,矢量的大小将增加一个。此外,如果v = [1,2,3,4]; v(2) = [5,5]; 中存在多个a值,我不确定如何一次性替换它们。

我怎样才能在MATLAB中做到这一点?

4 个答案:

答案 0 :(得分:6)

这是使用单元格数组的解决方案:

% remember the indices where a occurs
ind = (v == a);
% split array such that each element of a cell array contains one element
v = mat2cell(v, 1, ones(1, numel(v)));
% replace appropriate cells with two-element array
v(ind) = {[b c]};
% concatenate
v = cell2mat(v);

与rayryeng的解决方案一样,它可以替换多次出现的a

硅晶片提到的问题,即阵列改变尺寸,这里通过将部分阵列中间保持在单元阵列的单元中来解决。转换回数组会使这些部分变得模糊不清。

答案 1 :(得分:5)

我要做的就是首先找到等于v的{​​{1}}的值,我们将其称为a。然后,创建一个输出大小等于ind的新输出向量,因为我们将numel(v) + numel(ind)a的每个值替换为附加值,然后使用索引来放置我们的新价值观。

假设您已创建向量v,请执行以下操作:

v

%// Find all locations that are equal to a ind = find(v == a); %// Allocate output vector out = zeros(1, numel(v) + numel(ind)); %// Determine locations in output vector that we need to %// modify to place the value b in indx = ind + (0:numel(ind)-1); %// Determine locations in output vector that we need to %// modify to place the value c in indy = indx + 1; %// Place values of b and c into the output out(indx) = b; out(indy) = c; %// Get the rest of the values in v that are not equal to a %// and place them in their corresponding spots. rest = true(1,numel(out)); rest([indx,indy]) = false; out(rest) = v(v ~= a); indx语句相当棘手,但肯定不难理解。对于indy中等于v的每个索引,发生的情况是,对于a的每个索引/位置,我们需要将向量移过1,该v等于{{1} }}。第一个值要求我们将向量向右移动1,然后下一个值要求我们相对于前一个移位向右移动1 ,这意味着我们实际需要取第二个索引并向右移动2,因为这是相对于原始索引。

下一个值要求我们相对于第二个移位向右移动1 ,或者相对于原始索引向右移动3,依此类推。这些转变定义了我们将要放置a的位置。要放置b,我们只需生成用于放置c的索引,然后将其移到右侧1.

剩下的是用那些不等于b的值填充输出向量。我们只需定义一个逻辑掩码,其中用于填充输出数组的索引的位置设置为a,而其余的设置为false。我们使用它来索引输出并找到那些不等于true的位置来完成赋值。

示例:

a

使用上面的代码,我们得到:

v = [1,2,3,4,5,4,4,5];
a = 4;
b = 10;
c = 11;

这成功地将out = 1 2 3 10 11 5 10 11 10 11 5 中的每个值替换为v的元组。

答案 2 :(得分:4)

我认为strrep值得一提。 虽然它被称为字符串替换并且警告非char输入,但它对其他数字(包括整数,双精度甚至复数)仍然可以正常工作。

v = [1,2,3,4] 
a = 2, b = 5, c = 5
out = strrep(v, a, [b c])

Warning: Inputs must be character arrays or cell arrays of strings.
out =
     1     5     5     3     4

答案 3 :(得分:2)

您没有尝试覆盖向量中的现有值。您正在尝试更改向量的大小(表示向量中的行数或列数),因为您正在添加元素。这将始终导致向量在内存中重新分配。

使用 v 的第一部分和后半部分创建一个新的向量。

假设您的索引存储在变量索引中。

index = 2;
newValues = [5, 5];
x = [ v(1:index), newValues,  v(index+1:end) ]

x =

     1     2     5     5     3     4