matlab中数组、矩阵、cell

内容提要:
1.创建和初始化
2.动态赋值和扩展
3. 引用
4. 赋值
5. 其他
注意:
cell有1*4double和1*4cell的,对于前者可以用普通的圆括号和大括号进行引用,对于后面的引用就比较困难了。

数组:

1.动态数组的使用
https://zhidao.baidu.com/question/67076146.html
A=[];
A(1)=2;
A(2)=3;
A(3)=7;


x=[1,2,3]
x(2)  %矩阵就是这样引用的
对于字符串数组同样食用
X=['1,2,3']
x(1)


多维数组的应用
1.矩阵的增加和减少
a=[1 1;2 2];
a=[a [3;3]]
a=[a [3;3]]  %矩阵的增加 其实就是两个相同维度的矩阵的简单拼接我感觉
a(:,1)=[]   %减少第一列的矩阵


2.定义多维空矩阵
A=[]即可


3.由低维数组创建高维数组
https://jingyan.baidu.com/article/5225f26b0a6650e6fa0908ea.html

D2=[1,2,3;4,5,6;7,8,9];

C=cat(3,D2,2*D2,3*D2)

4.最后折衷了一下
https://wenku.baidu.com/view/78cec1f7f61fb7360b4c6509.html


5.多维矩阵就是这样慢慢建立的吗?厉害了
A=[1,2,3;4,5,6];
A(:,:,2)=ones(2,3); %表示增加了一维度 然后重新建了一个矩阵
A


但是我这么做
A=ones(1,5)
A(:,:,2)=ones(1,5); %表示增加了一维度 然后重新建了一个矩阵
A
改为
A(:,2)=ones(1,5);  这里却失败了 我觉得原因是因为这是矩阵的缘故




6.最终方案
A=ones(1,5);
A(:,:,2)=ones(1,5); %表示增加了一维度 然后重新建了一个矩阵
A(:,:,3)=A(:,:,2);
X=A(:,:,3)



7.最终方案一定就是这个了
A=ones(1,5);
A(:,:,2)=ones(1,5); %表示增加了一维度 然后重新建了一个矩阵
A(:,:,3)=A(:,:,2);
X=A(:,:,3);
b=A(1,5,3)
A




矩阵:矩阵是方形的数值型的数组,所以可以由一些函数生成,其他的应用方式则和矩阵式一样的

cell:

1 动态cell
a = [1 2 3]; b = [4 5 6 7 8]; c= [10 11];
d ={}; d{1}=a; d{2}=b; d{3}=c; 
celldisp(d)可以用来显示元胞数组d;

赋初值的方法主要是这两种
1.obstacle={38.5 23.5 6 6;40-3.0/2 25-3.0/2 3 3}; 或者中间用逗号

2 用变量
x=[1,2,3];
y=[3,2,3];
obstacle={x,y};
3.cell的引用(大括号和圆括号不)

跟普通的三维数组是一样的,但是要注意用大括号
如果里面只有一个数字,它会采取行优先类似的计数方法x1=obstacle{1};
圆括号引用法 :x1=obstacle(1,:);  可以得到一组值
x1=obstacle{1,:}; 这种方法是错误的
C = 2x2 cell array
    {1x3 double}    {1x3 double}
    {1x2 cell  }    {1x1 struct}

使用大括号 {} 访问特定元胞的完整内容。例如,从包含某个数值向量的元胞返回该向量。

C{1,2}
ans = 

   100   200   300
批量赋值 bb(ii,:)=ss(end-19:end-1);

4.数组和cell互转
数组存到cell中之后,再访问的时候就变成cell了,用这种方法将再次得到矩阵
x=[40 25 3 3];
y=[40 25 3 3];
obstacle={x,y};  矩阵转为cell=2*4double
z=[obstacle(1)]
numericVector = cell2mat(z);
all=dataread_all('input.txt');
num=cell2mat(all(1,3));  %得到障碍物的数量  将cell转换为数组
 ```
 ```
5.我的方案失败的原因是在这里,getline将空格变成了逗号,就是把任何东西都读为字符串,以逗号隔开
显示:
 1×1 cell 数组
    {1×3 cell}
 1×3 cell 数组
    {'25,25,10,10,0'}    {'12,42,4,4,1'}    {'46,14,8,8,1'}
这表示cell里面的元素还是cell,相当于里面是字符串,可以进一步的调用,但是已经是字符串了,逗号也是一个元素
1×2 cell 数组
    {1×5 double}    {1×5 double}
这表示cell里面的元素是double
给一个完整的解释
obstacle =
  1×3 cell 数组
    {'25,25,10,10,0'}    {'12,42,4,4,1'}    {'46,14,8,8,1'}
b2 =
  1×2 cell 数组
    {1×1 cell}    {1×1 cell}
all =
  1×10 cell 数组
    {'50,50'}    {'41,26,3,3'}    {[3]}    {1×3 cell}    {[6]}    {1×6 cell}    {'20,40'}    {'3'}    {'250'}    {'5'}
首先我发现cell只显示第一层次,b2里面有两层所以只显示一层
其次由obstacle可发现,后面的都是一个整体没有层次结构
7.下面一个有意思得例子,说明了从cell到数值其实还有通过手写来实现的方式进行引用
据说。cell2mat只能适合元胞数组是n*n维的情况,我最近也遇到了这个问题,如下的程序可能会帮到你

% 将数字字符元胞数组转化成double
cell_str_list = {'1 2 3 4 5 6'; '1 3 4'};

a_str = char(cell_str_list);
a_str = a_str.';
a_str = (a_str(:)).';

b_str='';
for ii=1:length(a_str)
    b_str=strcat(b_str,strtok(a_str(ii))); %strtok除去分隔符
end
b_str;

for ii=1:length(b_str)
    b_double(ii)=str2double(b_str(ii));
end
b_double;

8.如果中间隔得是逗号,那么就是一个字符串了,现在是1*6个字符串(我的方案就是变成了一字符串)
字符串到double
a={'1.025000e-06'        '1.050000e-06'        '1.075000e-06'        '1.100000e-06'        '1.125000e-06'        '1.150000e-06'};
num=length(a);
for ii=1:num
   b(ii)=str2double(a{1,ii});
end
b

8.最终的解决方案  没有解决 居然连逗号也包括在里面了
all=dataread_all('input.txt');

num=cell2mat(all(1,3));  %得到障碍物的数量  这个元素很凑巧,因为它碰巧只有一个字符

obstacle1=all(1,4)  
o1=obstacle1{1,1}
o2=o1{1,1}
% anss=str2double(o2)   %得到252510100
9
注意字符型cell和字符串型的cell的差别
a={'1','2','3','4'}
a =
  1×4 cell 数组
    {'1'}    {'2'}    {'3'}    {'4'}

a={1,2,3,4,5}
a =
  1×5 cell 数组
    {[1]}    {[2]}    {[3]}    {[4]}    {[5]}


这个例子是想说明,cell的最小单位不是字符,所以返回的是整个字符串,然后字符串的最小单位是字符
    a2 =
  1×1 cell 数组
    {'1,2,3,4,5'}
a2{1,1}=
    '1,2,3,4,5'
a211(1,1)='1'

12 最后的最后采取的方法是
将每一行都用table读取进来,然后用table进行访问
function input1 = importfile2(filename)
%IMPORTFILE2 将文本文件中的数值数据作为矩阵导入。
%   INPUT1 = IMPORTFILE2(FILENAME) 读取文本文件 FILENAME 中默认选定范围的数据。
%
%   INPUT1 = IMPORTFILE2(FILENAME, STARTROW, ENDROW) 读取文本文件 FILENAME 的
%   STARTROW 行到 ENDROW 行中的数据。
%
% Example:
%   input1 = importfile2('input.txt', 1, 17);
%
%    另请参阅 TEXTSCAN。

% 由 MATLAB 自动生成于 2018/03/30 10:09:33

%% 初始化变量。
delimiter = ',';
if nargin<=2
    startRow = 1;
    endRow = inf;
end

%% 每个文本行的格式:
%   列1: 双精度值 (%f)
%   列2: 双精度值 (%f)
%   列3: 双精度值 (%f)
%   列4: 双精度值 (%f)
%   列5: 双精度值 (%f)
% 有关详细信息,请参阅 TEXTSCAN 文档。
formatSpec = '%f%f%f%f%f%[^\n\r]';

%% 打开文本文件。
fidin = fopen(filename,'r');
fileID = fopen(filename,'r');
nline = 0;

while ~feof(fidin)         %判断是否为文件末尾 
      nline = nline+1;
      fgetl(fidin);   
end
endRow=nline;

%% 根据格式读取数据列。
% 该调用基于生成此代码所用的文件的结构。如果其他文件出现错误,请尝试通过导入工具重新生成代码。
dataArray = textscan(fileID, formatSpec, endRow(1)-startRow(1)+1, 'Delimiter', delimiter, 'TextType', 'string', 'EmptyValue', NaN, 'HeaderLines', startRow(1)-1, 'ReturnOnError', false, 'EndOfLine', '\r\n');
for block=2:length(startRow)
    frewind(fileID);
    dataArrayBlock = textscan(fileID, formatSpec, endRow(block)-startRow(block)+1, 'Delimiter', delimiter, 'TextType', 'string', 'EmptyValue', NaN, 'HeaderLines', startRow(block)-1, 'ReturnOnError', false, 'EndOfLine', '\r\n');
    for col=1:length(dataArray)
        dataArray{col} = [dataArray{col};dataArrayBlock{col}];
    end
end

%% 关闭文本文件。
fclose(fileID);
fclose(fidin);
%% 对无法导入的数据进行的后处理。
% 在导入过程中未应用无法导入的数据的规则,因此不包括后处理代码。要生成适用于无法导入的数据的代码,请在文件中选择无法导入的元胞,然后重新生成脚本。

%% 创建输出变量
input1 = table(dataArray{1:end-1}, 'VariableNames', {'VarName1','VarName2','VarName3','VarName4','VarName5'});

其他一些乱七八糟的

11.一个例子留着学习
clear;
fid=fopen('D:\学习\网站.txt','r');
ss=fgets(fid);
ii=1;
while (length(ss)~=1)
bb(ii,:)=ss(end-19:end-1);
ii=ii+1;
ss=fgets(fid);
end
bb里面存储的就是提取出来的日期时间





13.矩阵(也叫数组)和cell的区别
x={'','10'}  这样定义的是一个cell 其中第一个是一个空cell
x=[','10']
x={'','10'}
x{1,2}
x(2)
这就是两种访问方式


14  批量赋初值的问题,这样得到是9个double 0一个cell ‘10’
y={};
y{1,10}='10';
y
手写了一个很low的不知道能不能解决问题

clc;
y={};
for i=1:50
    if i%10==0
        y{1,10}='10';
    else 
        y{1,10}='';
    end
end

最后的解决方案
clc;
y={};
for i=1:50
    if mod(i,10)== 0
        y{1,10}='10';
    else 
        t='';
        y{1,i}=t;
    end
end

唉,没办法,只能暴力解决了


15.字符串转换函数
用num2str函数,可以用help+nim2str查看帮助!
>> A=[1,1,2,2,3,3]
A =
     1     1     2     2     3     3
>> B=num2str(A)
B =
1  1  2  2  3  3
>> class(B)

一个函数的使用问题

 [m,y]=dis(x) 
 调用的时候可以这样 [y m]=dis(x) ,或者dis(x)它会默认得到y m,主要是注意相对位置决定值,而不是名字
<think>好的,我现在需要解决如何在MATLAB中将cell数组换为数值矩阵的问题。让我先回忆一下之前学过的相关知识,并结合提供的引用内容来思考解决方法。 首先,用户提到的引用中,引用[2]提到了cell2mat函数可以将单元格数组合并为矩阵。这应该是一个直接的方法。例如,如果cell数组中的每个元素都是相同类型的数值,可以直接使用cell2mat函数换。比如E是一个2x2的cell数组,使用F = cell2mat(E)就能合并成矩阵F。这个方法应该是最直接的,适用于元素本身已经是数值的情况。 不过,用户的问题可能更复杂,比如cell数组中的元素可能是字符串或者其他类型的数据,这时候需要先进行换。例如,引用[4]中的str2double函数可以将字符串或字符元胞数组换为双精度数值。如果cell数组中的元素是字符串形式的数字,比如{'123', '45.6'},那么可以先使用str2double将这些字符串换为数值,然后再组合成矩阵。例如,c = {'37.294e-1'; '-58.375'; '13.796'}; d = str2double(c); 这样d就是一个双精度数组,可以直接用了。 那如果cell数组中的元素不一致,比如有些是数值,有些是字符串,这时候可能需要先统一类型。例如,先遍历cell数组,将字符串元素换为数值,再使用cell2mat。或者,如果存在不同数据类型的混合,可能需要使用cellfun函数来处理每个元素。例如,使用cellfun(@str2double, cell_array)来将每个元素换为数值,前提是元素都是可以换的字符串。 另外,如果cell数组是多维的,或者结构更复杂,可能需要确保换后的维度匹配,以便能够合并成矩阵。例如,每个cell元素本身是一个标量或者相同大小的矩阵,这样cell2mat才能正确拼接。 还有一个情况是,cell数组中的元素是结构体或其他复杂类型,这时候可能需要提取其中的某个字段来形成矩阵。但这种情况可能不在当前问题范围内,当前问题主要关注数值换。 总结一下,可能的步骤是: 1. 检查cell数组中的元素类型。如果是数值类型,直接使用cell2mat。 2. 如果元素是字符串,使用str2double换后再合并。 3. 如果元素类型不一致,可能需要先统一类型,再换。 接下来,我需要验证这些思路是否正确,并查看是否有其他方法。比如,引用[3]提到writematrix函数,但那是用于写入文件的,可能不直接相关。引用[2]中的mat2cellcell2mat是关键函数。此外,引用[4]中的str2double处理字符串换。 可能的示例场景: 1. 全部数值cell数组: c = {1, 2, 3; 4, 5, 6}; m = cell2mat(c); % 得到2x3矩阵 2. 字符串类型的数值cell数组: c = {'1', '2.5', '3'; '4', '5.6', '7'}; m = cellfun(@str2double, c); % 换为数值矩阵 3. 混合类型的情况可能需要更复杂的处理,比如检查每个元素是否为字符,然后换。例如: c = {1, '2.5', 3; '4', 5, '6.7'}; % 遍历每个元素,换字符串为数值 for i = 1:numel(c) if ischar(c{i}) c{i} = str2double(c{i}); end end m = cell2mat(c); 但要注意,如果换失败(比如有非数字字符串),会得到NaN。这时候可能需要错误处理。 此外,如果cell数组中的元素是不同大小的矩阵cell2mat可能无法直接合并,需要确保所有元素的大小兼容,例如都是标量,或者可以沿某一维度拼接。 现在,根据这些思考,可以整理出步骤和示例代码,确保覆盖不同的情况,并且引用正确的函数和方法。同时,需要引用提供的参考资料中的相关信息,比如引用[2]中的cell2mat和引用[4]中的str2double。</think>在MATLAB中将cell数组换为数值矩阵的常见方法如下: --- ### **方法一:直接使用`cell2mat`函数** **适用条件**:当cell数组的每个元素是**相同类型的数值**时,可以直接合并。 ```matlab % 示例1:元素均为数值 c = {1, 2; 3, 4}; m = cell2mat(c); % 输出2x2矩阵 [1 2; 3 4] ``` **原理**:`cell2mat`将单元格数组按维度拼接为矩阵[^2]。 --- ### **方法二:字符串数值换为矩阵** **适用条件**:当cell数组元素为**字符串形式的数值**时,需先换为数值。 ```matlab % 示例2:元素为字符串数值 c = {'1.2', '3.4'; '5', '6.7'}; m = str2double(c); % 输出2x2矩阵 [1.2 3.4; 5 6.7] ``` **原理**:`str2double`将字符串或字符元胞数组换为双精度数值[^4]。 --- ### **方法三:混合类型处理** **适用条件**:当cell数组包含**数值和字符串混合类型**时,需统一类型后合并。 ```matlab % 示例3:混合类型(数值+字符串) c = {1, '2.5'; 3, '4'}; % 遍历换字符串元素 for i = 1:numel(c) if ischar(c{i}) c{i} = str2double(c{i}); end end m = cell2mat(c); % 输出2x2矩阵 [1 2.5; 3 4] ``` --- ### **方法四:使用`cellfun`批量处理** **适用条件**:需对每个元素执行统一操作(如类型检查或换)。 ```matlab % 示例4:批量换字符串或保留数值 c = {'10', 20; 30, '40'}; m = cellfun(@(x) ischar(x)*str2double(x) + ~ischar(x)*x, c); % 输出2x2矩阵 [10 20; 30 40] ``` --- ### **注意事项** 1. **维度匹配**:cell数组中的元素需满足矩阵拼接的维度要求(如均为标量或相同大小的子矩阵)[^2]。 2. **非数值内容**:若cell包含非数值字符(如字母),`str2double`会返回`NaN`,需额外处理。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值