在MATLAB中将可变长度单元的输出写入单个列单元阵列

时间:2016-03-20 03:58:16

标签: matlab matrix

我正在尝试将可变长度单元阵列的输出写入单个列单元阵列。

例如:

我有

A    a;b
B    c 
C    b;c
D    a;b;d
E    e;g;h
F    a;b

作为输入文件。我想将第二列中的所有条目读入一行中的单独单元格,并将输出存储为以下内容:

a
b
c
b
c
a
b
d.... and so on.

我试过

for m=1:size(txt)
c(:,m)=strsplit(txt{m},';');

end

但是,我无法将输出写入列并收到以下错误:

Assignment has more non-singleton rhs dimensions than non-singleton subscripts

我了解c的维度应该大于size(txt)的维度,但我不知道如何输入c的输出到第一个空单元格中柱。

1 个答案:

答案 0 :(得分:2)

这是因为您已将strsplit声明为矩阵,但您希望它是一个列。此外,1 x N创建单元格数组结果,此处每个拆分字符串都放在单元格数组的元素中。此外,此单元格数组是行方式单元格数组,这意味着您将获得一个维度为N的单元格数组,其中strsplit是调用c = cell(numel(txt), 1); for m = 1 : numel(txt) c{m} = strsplit(txt{m}, ';'); end c = horzcat(c{:}); 所产生的字符串总数。

因此,我建议你做的是创建一个主单元格数组,在迭代每一行时存储所有字符串,然后在最后连接并创建一个最终的单元格数组。

假设您在此之前编写的代码是正确的,请执行以下操作:

horzcat

第一行创建一个主单元格数组,用于存储文本文件每行的字符串拆分字符。接下来,对于文件的每一行,我们使用分号字符作为分隔符拆分字符串,并将这些拆分结果放入主数组中的右侧单元格中。完成后,我们使用horzcat将所有字​​符放入一行单元格中。这会创建一个的单元格数组元素。由于我们将许多行方式单元阵列连接成一行,因此需要使用c = horzcat(c{:}).'; 。试图垂直执行此操作会给您一个错误。如果您想要一列,只需转置结果:

#include<iostream>
#include<string>
#include <iomanip>
using namespace std;

#include "C:\Users\barta\OneDrive\Documents\Visual Studio 2015\Projects\Project 4\Project 4\array.h"

void displayPlane(char msg[], char[ROW][COL]);
void getData(int &, char &);
void salesReport(int classCtr[],double fare[], string classes[]);

int main()
{
    int row = 0;
    char seat;


    while (row != -1)
    {

        displayPlane("\tChesapeaake Airlines", layout);
        cout << endl;
        getData(row, seat);
        if (row == -1)
            break;
        cout << endl;
        int COL = seat - 'A';
        if (layout[row - 1][COL] == 'X')
        {

            cout << "Sorry this seat is taken" << endl;
        }
        else
        {

            layout[row - 1][COL] = 'X';

        }

    }   
    double percentOccupied;
    std::cout << std::fixed;
    std::cout << std::setprecision(2);
    int total = 0;
    for (int i = 0; i < 2; i++)
    {
        total += classCtr[i];
    }

    cout << setw(18) << "Total Seats =  " << total << endl;
    percentOccupied = ((double)total / 36) * 100;
    cout << setw(22) << "Percent Occupied = " << percentOccupied << endl;

    salesReport(classCtr, fare, classes);
    cout << endl;
    cout << "Have a nice day! " << endl;

    system("pause");
    return 0;
}
void displayPlane(char msg[] , char[ROW][COL])
{
    cout <<msg << endl;
    for (int r = 0; r < ROW; r++)
    { cout << endl;
    cout << setw(4) << r + 1;
        for (int c = 0; c < COL; c++)
        {
            cout << setw(4) << layout[r][c];
        }

    }

}
void getData(int& row, char& seat)
{
        cout << "Enter row <-1 to stop>  ";
        cin >> row;
        if (row == -1)
            return;
        if (row == 1)
        {
            classCtr[0]++;
        }
        else if (row == 2 || 3 || 4)
        {
            classCtr[1]++;
        }
        else if (row == 5 || 6 || 7 || 8)
        {
            classCtr[2]++;
        }

        cout << "Enter your prefered seat  ";
        cin >> seat;
        seat = toupper(seat);


}
void salesReport(int classCtr[], double fare[], string classes[])
{

    cout << " \tTicket Price" << setw(20) <<"Total Sales\n\n"
        << setw(14) << classes[0] << "\t" << fare[0] << setw(6) <<classCtr[0] << "\n\n"
        << classes[1] << "\t" << fare[1] << setw(6) <<classCtr[1] <<"\n\n"
        << setw(14) << classes[2] << "\t" << fare[2] << setw(6) << classCtr[2];
}