我必须创建一个函数,将一个向量v
和三个标量a
,b
和c
作为输入。该函数使用两个元素数组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中做到这一点?
答案 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