1

我有一个矩阵

 DataSet(1000,400)

我希望将每一行复制到最初声明为的最终矩阵中

FinalDataSet=[]

我遵循的复制规则如下,基于用户输入

 For any row i in "DataSet"
      if user enters a character X
          Add to FinalDataSet the vector (X,All Elements of DataSet(i))
      else do nothing

我为上面实现了以下代码

n=size(DataSet,1);
for i=1:n
     element=inputdlg('Enter Character');
     if(~isempty(element))
          FinalDataSet=[FinalDataSet;[element DataSet(i,:)]];
     end
 end

(输入对话框,我观察到,[]如果按下取消,则返回)

但是,当我执行上面的代码 FinalDataSet有以下形式

 'H'    [1x400 double]
 'g'    [1x400 double]
 'i'    [1x400 double]

这里有什么问题?是因为我试图结合两种不同类型的向量吗?如何获得 (1000,401) 维度矩阵而不是 (1000,2) 矩阵?

我的感觉是,我要么需要为字符存储相应的 ASCII 值,要么完全为用户选择管理一个单独的向量。但是,没有上述两种方法可以吗?请帮忙!!

4

2 回答 2

1

我花了一些时间才意识到问题所在。您确实无法获得包含字母的矩阵。

如果你真的想要这个,解决方案是简单地将所有内容存储在一个 1000x401 单元格数组中,如下所示:

c =  ['H' num2cell(1:10)]

但是,您将放弃通过矩阵处理获得的大量便利/效率。

因此我建议这个替代方案:

如果您满足于将字符存储为数字,您可以执行以下操作:

element = {'H'} % inputdlg returns a 1x1 cell
i=1;
DataSet = rand(1000,400);

v = [element{1}+0 DataSet(i,:)]

然后查看它是哪个字母,您可以使用char

char(v(1))
于 2013-11-14T16:26:39.570 回答
0

另一种可能性是使用结构。您可以在结构名称后面附加字母以查找相应的数组。放置在结构中不同点的所有数组的大小都可以不同,并且不一定必须与您的大小相同。这是在您的代码中实现的:

n=size(DataSet,1);
for i=1:n
     element=inputdlg('Enter Character');

     if(~isempty(element))
         FinalDataSet.element=DataSet(i,:)
     end
end

从结构中读取数据是通过使用相应元素调用结构来完成的,这里我们以 x 为例。

xdata = FinalDataSet.x;

您需要注意的是不要两次使用该元素,因为您将覆盖以前的数据。或者,如果元素已经存在于数组中并发出警告,请执行测试。希望这可以帮助。

于 2013-11-14T16:49:32.110 回答