MATLAB:用于循环结构

时间:2016-06-23 03:56:04

标签: matlab for-loop vector

这是一个基本的程序,但由于我是MATLAB的新手,我无法找到解决方案。

我有一个列向量"时间"我想要打印价值" 1"在前147个细胞中,接着是" 2"在148到2 * 147细胞等。为此,我写了以下脚本:

 Trial>> c=1;
 Trial>> k=0;
 Trial>> for i = c:146+c
            Time(i,1)=1+k;
            c=i;
            k=k+1;
            end

我知道我需要迭代循环"时间(i,1)= 1 + k;"在它执行下一个语句之前。我试过使用休息,但这不应该工作。任何人都可以建议我获得所需结果的解决方案吗?(在C中使用花括号非常简单。)

4 个答案:

答案 0 :(得分:3)

我确定您不想在每次迭代中运行c=i;

我的代码应该适合您:

x = 10; % Replace 10 by the max number you need in your array.
k = 1;
for i = 1 : x * 147
    Time(i, 1) = k;
    if rem(i, 147) == 0
        k = k + 1;
    end
end

答案 1 :(得分:3)

这是应该是vectorized 的一段代码的主要示例,可以帮助您理解vectorization。您的代码可以这样写:

n = 147;
reps = 10; %% Replace this by the maximum number you want your matrix to have

Time = reshape(bsxfun(@plus, zeros(n,1), 0:reps), 1, []);

<强>解释

A为列向量(1列,n行),B为行向量(1行,m列。

此处bsxfun(@plus, A, B)将在A中添加B中所有元素的所有元素,如下所示:

A(1)+B(1)  A(1)+B(2)  A(1)+B(3) ... A(1)+B(m)
A(2)+B(1)  A(2)+B(2)  ............. A(2)+B(m)
............................................
A(n)+B(1)  A(n)+B(2) .............. A(n)+B(m)

现在,对于我们提供的两个向量:zeros(n,1)0:reps,这将为我们提供;

0+0        0+1        0+2           0+reps
0+0        0+1        0+2           0+reps
% n rows of this

所以,我们现在需要做的是将每列放在彼此之下,这样你就会先让列为零,然后是带有1的行,......最后是带有reps的列(在你的情况下147。)

这可以通过reshaping矩阵来实现:

reshape(bsxfun(@plus, zeros(n,1), 0:reps), [], 1);
^       ^                                  ^   ^
|       |                                  |   Number of rows in the new matrix. When [] is used, the appropriate value will be chosen by Matlab
|       |                                  Number of rows in the new matrix
|       matrix to reshape
reshape command   

另一种方法是使用kron

kron(ones(reps+1, 1) * 0:(n-1)

要记录,请查看您的代码:

您应该始终为循环内创建的矩阵预分配内存。在这种情况下,您知道它将成为维度((reps+1)*n-by-1)的矩阵。这意味着您应该Time = zeros((reps+1)*n, 1);。这将大大加快您的代码速度。

你不应该在Matlab中使用ij作为变量名,因为它们表示虚构单位(sqrt(-1))。例如,您可以执行:for ii = 1:(n*147)

当循环应该从c到c + 146时,你不希望循环中有c=i。这没有多大意义。

答案 2 :(得分:2)

您可以使用repmat

x = 10; % Sequence length (or what ever it can be called)
M = repmat(1:x,147,1); % Replicate array 1:x for 147 columns
M = M(:); % Reshape the matrix so that is becomes a column vector.

我可以假设这是一个练习循环的任务,但这样可行。

答案 3 :(得分:1)

另一种解决方案可能是

[UINavigationBar appearance].setTitleTextAttributes = [NSForegroundColorAttributeName : [UIColor whiteColor]
[UINavigationBar appearance].barTintColor = [UIColor blueColor]
[UINavigationBar appearance].barStyle = UIBarStyleBlack

首先构造一个具有所需长度的数组。然后你分开,向上一轮。然后1到147将变为1。