【问题标题】:Matlab: how to make [1 3 5] become [1 nan 3 nan 5]Matlab:如何使 [1 3 5] 变为 [1 nan 3 nan 5]
【发布时间】:2016-11-27 23:44:22
【问题描述】:

如果有一个名为numbers 的数组如下所示。如何转换此数组,使numbers 变为realNumbers,如下所示,其中numbers 中不存在的1:10 中的任何数字都用nan 填充。 realNumbers 是我想要的结果,在计算之前不存在,只有 numbers 存在。这是在 Matlab 代码中。

numbers = [1 3 5 6 10];
realNumbers = [1 nan 3 nan 5 6 nan nan nan 10];

【问题讨论】:

  • 您的示例在一定程度上暗示了这一点,但是,当您说real 时,您的意思是real,或者特别是integers?因为您在下面得到的答案特定于integers

标签: arrays matlab vector nan


【解决方案1】:

当数字是整数时,您已经有了答案。但是,您的问题通常特别要求 real 数字,因此我将给出更通用的解决方案。

>> Numbers = [0.5, 2, 3.5]
Numbers =
   0.5  2.0  3.5
>> RealNumbers = [0:0.5:5]
RealNumbers =
   0.0  0.5  1.0  1.5  2.0  2.5  3.0  3.5  4.0  4.5  5.0
>> Members = ismember (RealNumbers, Numbers)
Members =
   0    1    0    0    1    0    0    1    0    0    0
>> RealNumbers(~Members) = nan
RealNumbers =
   NaN  0.5  NaN  NaN  2.0  NaN  NaN  3.5  NaN  NaN  NaN

【讨论】:

  • PS:ismember还有一个好处就是RealNumbers/Numbers中的排序无关紧要。
【解决方案2】:

另一种方式,使用非常通用的accumarray 函数:

numbers = [1 3 5 6 10];
realNumbers = accumarray(numbers(:), numbers(:), [], @(x)x(1), NaN).';

【讨论】:

    【解决方案3】:
    realNumbers = nan(1,10);
    realNumbers(numbers) = numbers
    

    【讨论】:

    • 如何在不预先分配 nan 数组的情况下做到这一点?此外,realNumbers 是我想要的结果,并且在计算之前不存在。只有numbers 存在。
    • nan(min(numbers),max(numbers)) 怎么样。你的向量总是排序的吗?它总是有唯一的数字吗?它总是以 1 开头吗?
    • 向量numbers总是以唯一的数字排序,但可以以任何数字开头(不一定总是以1开头)。
    • 数字中有0吗?否则你可以这样做:realnumbers(numbers)=numbers; realnumbers(realnumbers==0)=NaN; 但实际上 shai 的解决方案对我来说看起来不错。为什么你不想预先分配NaN-array?编辑:“计算之前不存在实数”是什么意思?这有什么关系?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-17
    • 1970-01-01
    相关资源
    最近更新 更多