【问题标题】:how to create an arrays from rows using Matlab如何使用 Matlab 从行创建数组
【发布时间】:2015-02-23 20:50:53
【问题描述】:

大家好,我需要你的帮助,所以我有一个数组

a   b   c   n
1   1   2   4
1   3   2   6
1   6   0   7

我想从我的数组的每一行创建另一个数组,见下图。

我尝试使用此代码:

假设我的数据位于数组 M 所以,

for x=1:10
   d = M(:,4)/(M(:,1) + M(:,2) + M(:,3) + x)
end

但它没有给出我想要的输出

在excel中你只需要写下方程式然后把它拖下来,你会得到答案,但我不知道如何在matlab中做,我想我们可以使用for循环。谢谢。

请查看我想要的输出的红色框

【问题讨论】:

  • 如何从三行中得到 10 个值?我假设对于每一行重复该公式?您是否还意味着即使您只显示三行,您的输入数据也有十行?根据您发布的代码,我会这么认为...?你的代码中的d 是什么?
  • 因为您的 x = 1 到 10,这意味着您将创建另一个大小为 10x1 的 x 数组。和另一个 y 数组,它与 x、a、b、c 和 n 的值成正比,所以最后你会得到一个 x 和 y 的组合数组

标签: arrays matlab


【解决方案1】:

Matlab 中的等价物是:

data = [...
1   1   2   4;
1   3   2   6;
1   6   0   7]

x = (1:10).';
f = @(t) data(t,4)./(data(t,1) + data(t,2) + data(t,3) + x )

y = [ x f(1) x f(2) x f(3) ]

甚至更简单:

N = 10;
f = @(t) [(1:N).' data(t,4)./(data(t,1) + data(t,2) + data(t,3) + (1:N).' )]

y = [ f(1) f(2) f(3) ]

f(...) 中的数字始终表示哪一行,分别是哪一行y,例如y1y2 等您正在为输出的每一列进行计算。括号[...] 连接结果。

请注意,您需要使用element-wise division operator ./


针对n x m 大小的输入数组进行泛化,但假设n-列始终是输入矩阵的最后一个:

N = 10;
f = @(t) [(1:N).' data(t,end)./(sum( data(t,(1:end-1))) + (1:N).' )]

y = cell2mat(arrayfun(f, 1:size(data,1),'uni',0))

但在这种情况下,您应该考虑一下,如果像 Divakar's answer 这样更矢量化的方法可能更合适。


结果:

y =

            1          0.8            1      0.85714            1        0.875
            2      0.66667            2         0.75            2      0.77778
            3      0.57143            3      0.66667            3          0.7
            4          0.5            4          0.6            4      0.63636
            5      0.44444            5      0.54545            5      0.58333
            6          0.4            6          0.5            6      0.53846
            7      0.36364            7      0.46154            7          0.5
            8      0.33333            8      0.42857            8      0.46667
            9      0.30769            9          0.4            9       0.4375
           10      0.28571           10        0.375           10      0.41176

【讨论】:

  • 你们看到我想要的输出了吗?因为根据您的代码,它与我想要的输出不匹配。
  • @nobel 好吧,你应该澄清你的问题。您刚刚给出了一个关系 y = n/(a+b+c+d) - 这就是我们发布的内容。我不知道你想在第二张截图上告诉我们什么。请澄清
  • @nobel 您发布的唯一代码,您说它不起作用。用文字或方程式表达你想要得到的东西。
  • 根据图片,必须生成3个数组,每个数组的大小为10x2,包含x和y值。
  • @nobel 那么M 是什么? y2M是什么关系?
【解决方案2】:

Vectorized approach 获得所需的输出,bsxfun 获得所需输出的另一个很好的情况是 generic m x n 大小 输入数组 -

N = 10; %// Number of rows in the output
[m,n] = size(M) %// Get size

sum_cols = sum(M(:,1:n-1),2) %// sum along dim-2 until the second last column
sum_firstN = bsxfun(@plus,sum_cols,1:N) %// For each column-sum, add 1:N
out1 = bsxfun(@ldivide,sum_firstN,M(:,n)).'%//'# elementwise divide by last col
out = [repmat([1:N]',1,n); out1] %//'# Concatenate with starting columns of 1:N
out = reshape(out,N,[]) %// Reshape into desired shape

针对给定 3 x 4 大小的输入数组运行代码 -

out =
    1.0000    0.8000    1.0000    0.8571    1.0000    0.8750
    2.0000    0.6667    2.0000    0.7500    2.0000    0.7778
    3.0000    0.5714    3.0000    0.6667    3.0000    0.7000
    4.0000    0.5000    4.0000    0.6000    4.0000    0.6364
    5.0000    0.4444    5.0000    0.5455    5.0000    0.5833
    6.0000    0.4000    6.0000    0.5000    6.0000    0.5385
    7.0000    0.3636    7.0000    0.4615    7.0000    0.5000
    8.0000    0.3333    8.0000    0.4286    8.0000    0.4667
    9.0000    0.3077    9.0000    0.4000    9.0000    0.4375
   10.0000    0.2857   10.0000    0.3750   10.0000    0.4118

【讨论】:

  • 它必须生成3个数组,每个数组的大小为10x2,包含x和y值
  • @nobel 你只为y 提供了一个方程式,而没有为y2y2 提供方程式,那么我们应该如何知道这些关系呢?
  • 先生 y 是 y1,y2,和 y3 的一般方程:例如:y1 = n1/(a1 + b1 + c1 + x1),依此类推...
  • 是的,这是我想要的输出,非常感谢,抱歉我对我的问题的错误陈述。
  • @thewaywewalk 伙计们,做得很好。我知道我很厚,但我仍然没有理解问题......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多