请选择 进入手机版 | 继续访问电脑版
搜索
人大经济论坛 标签 MATLAB 相关日志

tag 标签: MATLAB经管大学堂:名校名师名课

相关日志

分享 Matlab学习系列005:结构数组
zhjx19 2015-1-17 19:10
编程语言要描述日常生活中的某一类事物,就是要赋予这类事物一个公共名称(类名),再把这类事物具有的各种属性分别存放为若干变量(数据元素),这就是“结构体”。结构体里再加上若干操作其数据元素的函数(成员函数),就是“类”。然后,“类”就可以作为新的数据类型定义对象(类的实例化),再操作这些对象,实现编程需要。 以上就是面向对象的编程思想(适合 C++ 或 Java )。 例如,描述学生,就用一个学生类 Student ;学生属性:学号、姓名、专业;实现操作:学生转专业。(粗略 C++ 代码) class Student { private: // 数据元素一般设为该类的私有数据,防止属性被随意修改 int number; string name; // string 定义字符串 string major; public: // 成员函数一般设为可公共访问 Student(int num, string n, string m); // 类构造函数用于生成具体对象,必须与类名相同 void ChangeMajor(String newmajor); } Student:: Student(int num, string n, string m) { number = num; name = n; major = m; } void Student:: ChangeMajor(String newmajor) // Student:: 表示函数是来自 Student 类 { major = newmajor; } // 下面是使用 Student 类: Student s1; // 用 Student 类定义一个“学生”对象 s1 s1. ChangeMajor(“Math”); // 把学生 s1 的专业修改为“ Math ” 可见,借助结构体或类的编程,既能与现实世界中的事物建立自然的对应(符合思维习惯),又能实现模型化的“批量生产”(用“类”可以整体性地、一遍一遍地建立对象、操作对象)。这也是结构体或类(面向对象编程)的优势所在。 __________________________ 回到 Matlab ,元胞数组只是呆板的堆放数据的仓库,结构数组则具有了与实际对象所对应的结构属性,这等同于“ C 语言的结构体”、“ C++ 或 Java 的类的数据成员部分”。 结构数组是由若干个结构( struct )组成,每个结构都包含多个结构域( fields );数据必须存放在结构域中,可以是任何类型、任意大小的数据。例如,多个图形对象构成一个结构数组,每个图形对象就是一个结构,图形对象的一个属性对应一个结构域。 即,结构数组(矩阵)的元素是结构,每个结构包含若干结构域。 一、 结构数组的创建 1. 用直接赋值语句创建 例 1 创建学生的结构数组,每个结构包含学号、姓名两个结构域(属性) student(1).number = '001'; % 直接对结构数组第 1 个结构 s(1) 的结构域 number 赋值 student(1).name = ' 张三 '; student(1).number = '002'; student(2).name = ' 李四 '; student 运行结果: student = 1x2 struct array with fields: number name 注意:上面是一维结构数组,也可以是二维或更多维的,例如, student(1,2).name = '……'; 2. 用 struct 函数创建 语法: s = struct(‘field1’, values1, ‘field2’, values2, …) student(1) = struct('number', '001', 'name', ' 张三 '); student(2) = struct('number', '002', 'name', ' 李四 '); student 运行结果同上。 二、结构数组的操作 1. 访问结构数组中的结构域 (1) 通过结构域访问操作符“ . ”例如, student(2).name 返回学生二的姓名:李四 (2) 利用 deal( ) 函数 = deal(student(:).name) 返回 name1 = 张三 name2 = 李四 “ : ” 表示所有结构域 (3) 利用 getfield( ) 函数获取指定结构域的值, 对于前面的结构数组 student ,大小是 1 × 2 getfield(student,{1,2},'name') % 返回结构数组 student 第 1 行第 2 列的结构的结构域为 name 的值, % 相当于 student(1,2).name 运行结果: ans = 李四 2. 其他操作 (1) 设置或修改结构域的值—— setfield( ) student = setfield(student,{1,2},'name', ‘ 王五 ’); ——修改 student(1,2).name 的值为 ‘ 王五 ’ 注意:必须把 setfield( ) 返回值赋给原结构数组,修改才会生效。 (2) 删除结构数组的指定结构域—— rmfield( ) s.field1 = ; s.field2 = 'string'; s.field3 = {1 2 3; 4 5 6}; s s = rmfield(s,{'field2','field3'}) s = rmfield(s,'field1') 运行结果: s = field1: field2: 'string' field3: {2x3 cell} s = field1: s = 1x1 struct array with no fields. 注意:必须把 rmfield( ) 返回值赋给原结构数组,删除才会生效。 (3) 判断函数 isfield(s, ‘fieldname’) ——判断 s 中是否含有名为 fieldname 的结构域; isstruct(s) ——判断 s 是否是结构数组 3. 结构数组与元胞数组的相互转换 (1) 结构数组转元胞数组—— struct2cell( ) s.field1 = ; s.field2 = 'string'; s.field3 = {1 2 3; 4 5 6}; s c = struct2cell(s) 运行结果: s = field1: field2: 'string' field3: {2x3 cell} c = 'string' {2x3 cell } (2) 元胞数组转结构数组 s = cell2struct(c, fields, dim) c = { ‘001’, ‘ 张三 ’, 175, 65; ‘002’, ‘ 李四 ’, 178, 70} fields = {'Num','Name','Height','Weight'}; % 临时变量,存放全部的结构域名 s = cell2struct(c,fields,2) % dim=2 表示将 c 按行转为结构数组(即每行是一个结构) % dim=1 表示将 c 按列转为机构数组(即每列是一个结构) s(1) 运行结果: c = '001' ' 张三 ' '002' ' 李四 ' s = 2x1 struct array with fields: Num Name Height Weight ans = Num: '001' Name: ' 张三 ' Height: 175 Weight: 65
个人分类: Matlab学习系列|22 次阅读|0 个评论
分享 Matlab学习系列004:元胞数组
zhjx19 2015-1-17 19:07
Matlab学习系列004:元胞数组
矩阵只能存放若干单一类型的数据,且不能存放矩阵(即矩阵元素不能是矩阵),也就是说矩阵只适合同时处理若干相同类型的数据。 Matlab 编程有时需要突破这种局限,同时处理不同类型的数据,或者处理更高层面的数据时需要把若干矩阵作为“元素”整体处理(当然,如果是同样大小的若干矩阵可以采用高一维的矩阵),就需要元胞数组了。 做个比喻的话,元胞数组就好比“橱柜”,由若干个“抽屉”构成,每个“抽屉”里可以存放任何“东西”(数据类型,包括矩阵)。这为 Matlab 编程提供了极大的方便性和灵活性。 注:矩阵的“元素”,叫做元素;元胞数组的“元素”,叫做元胞。元胞数组更准确的叫法,应该叫元胞矩阵。 一、 元胞数组的创建 三种方法: 1. 直接通过赋值语句创建 元胞数组可以理解成更大级别的矩阵(能存放矩阵),用“ { } ”来创建,以区别创建矩阵的“ ” a = {'hello' ; 1 {'1' '2'}} % 创建 2 × 2 的元胞数组, % 同行元素间用“ , 或空格”隔开 % 行与行间用“ ; ”隔开 % 第 1 行第 1 列的元胞,存放字符串 'hello' ; % 第 1 行第 2 列的元胞,存放一个 2 × 3 矩阵 % 第 2 行第 1 列的元胞,存放数 1 % 第 2 行第 2 列的元胞,存放 1 × 2 元胞数组 运行结果: a = 'hello' {1x2 cell } 2. 对元胞数组各元胞一一赋值 例如( 1 )中的元胞数组 a 也可以这样创建: a{1,1} = 'hello'; a{1,2} = ; a{2,1} = 1; a{2,2} = {'1' '2'}}; 3. 用 cell( ) 函数创建 a = cell(2,3) % 生成 2 × 3 的空元胞数组 此时, a = 再赋值或操作。 二、 元胞数组元胞的访问 访问元胞数组的元素根据不同需要有两种语法: (1) 用“ { } ” a{i, j} ——返回第 i 行第 j 列元胞的数据内容。比如, a 为前例中的元胞数组, a{1,2} = 1 2 3 4 5 6 (2) 用“ ( ) ” a(i,j) ——返回第 i 行第 j 列的元胞(外观)。比如, a(1,2) = 三、 元胞数组的操作(函数) iscell(a) ——判断 a 是否是元胞数组,返回逻辑值 1 或 0 ; celldisp(a) ——显示元胞数组 a 中各元胞的内容; celldisp(a,’cell1’) ——显示元胞数组 a 中各元胞的内容,用“ cell1 ”代替元胞数组名“ a ”; cellplot(a) ——以图形化的方式显示元胞数组 a 的内容; a = {'hello' ; 1 {'1' '2'}}; iscell(a) celldisp(a) celldisp(a,'cell') cellplot(a) 运行结果: ans = 1 a{1,1} = hello a{2,1} = 1 a{1,2} = 1 2 3 4 5 6 a{2,2}{1} = 1 a{2,2}{2} = 2 cell{1,1} = hello cell {2,1} = 1 cell {1,2} = 1 2 3 4 5 6 cell {2,2}{1} = 1 cell {2,2}{2} = 2 cellstr(S) —— S 为字符串矩阵,把字符串矩阵转换为元胞数组,每个字符串作为元胞数组的元胞位置不变,并去掉末尾的空格; S = {'hello' 'hi ';'yes' 'OK';'no' 'not';'goodbye' 'bye bye'}; cellstr(S) 运行结果: ans = 'hello' 'hi' 'yes' 'OK' 'no' 'not' 'goodbye' 'bye bye' 注意:字符串中间的空格保留。 num2cell(A,1) —— A 为数值矩阵,把数值矩阵转换为元胞数组,把 A 的每一列转换为一个元胞; num2cell(A,2) , A 的每一行转换为一个元胞; A = C = num2cell(A,1) D = num2cell(A,2) 运行结果: A = 1 2 3 4 5 6 7 8 9 10 11 12 C = D = mat2cell(X, M,N) ——把矩阵 X 转换为元胞数组, M 、 N 为向量, M 中各元素之和等于 X 的行数, N 中各行之和等于 X 的列数; 例,把 4 × 5 矩阵( 20 个数)转换为 2 × 2 ( 4 块)的元胞数组: A = reshape(1:20,4,5); B = mat2cell(A, , ) celldisp(C4) 运行结果: A = 1 5 9 13 17 2 6 10 14 18 3 7 11 15 19 4 8 12 16 20 B = B{1,1} = 1 5 9 2 6 10 B{2,1} = 3 7 11 4 8 12 B{1,2} = 13 17 14 18 B{2,2} = 15 19 16 20 另外,元胞数组可以类似矩阵操作实现变形( reshape( ) 函数)、拼接等(略)。 下次内容——结构数组(类似于 C 语言中的结构体)。
个人分类: Matlab学习系列|24 次阅读|0 个评论
分享 Matlab学习系列003:矩阵操作
zhjx19 2015-1-17 19:01
Matlab 的基本数据元素就是矩阵,可以是 2 维、 1 维(向量)、 3 维或更多维。 一、 矩阵创建与表示 Matlab 不用提前声明或定义变量,直接【起变量名、赋值、使用】(注 1 )。 1. 特殊向量:(注 2 ) k = 1 : 1 : 10 % 创建行向量 k ,起始值 1 ,步长 1 ,终止值 10 % 默认步长是 1, 即 k = 1 : 10 % 步长可以是负数(起始值 终止值) 运行结果: k = 1 2 3 4 5 6 7 8 9 10 2. 一般矩阵:(字符串为元素的矩阵建议用元胞数组,下次内容) A = % 创建 2 行 3 列矩阵 A, 矩阵大小不用预先定义 % 矩阵元素必须放在“ ”内 % 同行元素间用“ , 或空格”隔开 % 行与行间用“ ; ”隔开 % 矩阵元素可以是数值、变量、字符、函数表达式 运行结果: A = 1 2 3 4 5 6 3. 特殊矩阵: ones(m,n) % 生成 m × n 维的全“ 1 ”矩阵 zeros(m,n) % 生成 m × n 维的全“ 0 ”矩阵 eye(m,n) % 生成 m × n 维的单位矩阵(多余的行或列全为 0 ) diag(k 或 A) % 生成或提取对角矩阵 triu(A) % 提取矩阵 A 的上三角部分生成上三角矩阵 tril(A) % 提取矩阵 A 的下三角部分生成下三角矩阵 rand(m,n) % 生成 m × n 维的 (0,1) 区间均匀分布的随机矩阵 randn(m,n) % 生成 m × n 维均值为 0 ,方差为 1 的标准正态分布随机矩阵 fiplr(A) % 矩阵 A 左右翻转 fipud(A) % 矩阵 A 上下翻转 fipdim(A,dim) % 矩阵 A 特定维度 dim(1,2) 翻转 sparse() % 生成稀疏矩阵 full() % 将稀疏矩阵化为普通矩阵 4. 矩阵的维度、大小、长度 A = ; a = ndims(A) % 返回矩阵 A 的维度(几维矩阵) = size(A) % 返回矩阵 A 各维度维数的大小(几行,几列) L = length(A) % 返回矩阵 A 各维度维数的最大值(行数,列数的最大值) 运行结果: a = 2 I = 2 J = 3 L = 3 注: length() 通常用于测量向量的大小。 5. 矩阵拼接、扩充、变形 C = % 水平拼接 C = % 水平拼接 D = % 垂直拼接 E = repmat(A, ) % 排成 1 × 2 的两块 A ,同 F = repmat(A, ) % 排成 2 × 1 的两块 A ,同 X = 1:24; % 1 × 24 的一维行向量 reshape(X, 3,8); % 把 X 变形为 3 × 8 的二维矩阵 reshape(X, 3,8); % 把 X 变形为 3 × 8 的二维矩阵 二、矩阵元素的寻址和访问 1. 访问 2 维矩阵( m × n )各元素的位置有两种方式: ① 行列下标索引 A(i, j) ——第 i 行,第 j 列的元素 ② 线性索引,也是矩阵存放元素的顺序, reshape() 变形保持该顺序 A(1), A(2), … , A(m*n) ——元素依次取自第 1 列,再第 2 列,…… 故 A(i, j) = A( (j-1)*m+i) 两种索引间的转换函数: = ind2sub( size(A), IND) = sub2ind(size(A), I, J) find() 函数常用来查找矩阵中满足一定条件的元素 A = ; ind = find(A2); % 返回 A 中大于 2 的元素的线性索引值 = find(A2); % 返回 A 中大于 2 的元素的行列下标索引值 = ind2sub(size(A), ind) % 线性索引转行列下标索引 IND = sub2ind(size(A), I, J) % 行列下标索引转线性索引 运行结果: I = 2 J = 1 IND = 2 2 2 4 1 3 5 2 3 6 2. 用冒号“ : ”获取矩阵的一些元素 A(i, :) —— 矩阵 A 的第 i 行,所有列 A(:, j) —— 矩阵 A 的第 j 列,所有行 A(:,i: j) —— 矩阵 A 的第 i 到第 j 列,所有行 A(i:j, k:end) —— 矩阵 A 的第 i 到第 j 行,第 k 到最后一列 A(:, ) —— 矩阵 A 的第 1 、第 3 列,所有行 A(:) —— 按线性索引返回矩阵 A 的所有元素(向量) 3. 利用空矩阵删除矩阵元素 A(i, :) = ; % 删除矩阵 A 的第 j 列 A(i:j, :) = % 删除矩阵 A 的第 i 到第 j 列 A(sub2ind( size(A), i, j) ) = =eig(A) 2. 矩阵函数 min(A,dim) 按维度求矩阵 A 最小值, min(A) = min(A,1) 按列 max(A)=max(A,1) 求矩阵 A 各列的最大值 mean(A) = mean(A,1) 求矩阵 A 各列的平均值 sort(A) 矩阵各列按递增顺序排序 sort(A, 'descend') 矩阵各列按递减顺序排序 sum(A) 矩阵 A 各列元素求和 prod(A) 矩阵 A 各列元素求积 dot(A,B) A,B (同型)各列做内积(点积) cross(A,B) A,B (至少某个维度是 3 维)的外积(叉积) cumsum(A) 每列元素的累计和(第 i 行是 A 前 i-1 行元素的和) cumprod(A) 每列元素的累计积 四、三维矩阵 可以想象成一本书的“行、列、页”。 处理 k 个 m × n 的二维矩阵,可用一个 m × n × k 的三维矩阵 A : A(:, :, 1) 表示第 1 个 m × n 矩阵(第 1 页) A(:, :, 2) 表示第 2 个 m × n 矩阵(第 2 页) ……………… A(:, :, k) 表示第 k 个 m × n 矩阵(第 k 页) 每个 A(:, :, k) 与 2 维矩阵操作一样。 D = rand(2,4,3) % 生成 2 × 4 × 3 的随机矩阵 DS = reshape(D,3,4,2) % 变形 运行结果: D(:,:,1) = 0.1270 0.6324 0.2785 0.9575 0.9134 0.0975 0.5469 0.9649 D(:,:,2) = 0.1576 0.9572 0.8003 0.4218 0.9706 0.4854 0.1419 0.9157 D(:,:,3) = 0.7922 0.6557 0.8491 0.6787 0.9595 0.0357 0.9340 0.7577 DS(:,:,1) = 0.1270 0.0975 0.9575 0.9706 0.9134 0.2785 0.9649 0.9572 0.6324 0.5469 0.1576 0.4854 DS(:,:,2) = 0.8003 0.9157 0.6557 0.9340 0.1419 0.7922 0.0357 0.6787 0.4218 0.9595 0.8491 0.7577 注1. Matlab 的变量名必须字母开头,由字母、下划线、数字构成,对字母大小写敏感;起变量名时应避开 Matlab 里的关键词。 注2. Matlab 语句结束用分号,若不用分号则自动输出语句的运行结果。 矩阵删除单个元素必须用线性索引,否则会把报错。
个人分类: Matlab学习系列|19 次阅读|0 个评论
分享 Matlab学习系列:002. Matlab编程思想——向量化编程
zhjx19 2015-1-17 18:58
C 语言的基本元素是单数值(比如单变量或数组里的元素),再加上其结构化的特点,决定了通常 C 语言程序大都充斥着大量罗嗦的单变量循环和判断语句(注 1 )。 而 Matlab 是以向量、矩阵为基本元素的,所以要编写真正的 Matlab 程序必须抛弃【 C 语言那种“单数值、元素化”考虑问题】的思路,转以向量、矩阵为最小单位来考虑问题。也就是说, Matlab 的编程思想是——向量化编程,即面向向量或矩阵。 这样做的好处,至少有两个: (1) 代码大大简化,易编程、清晰可读性强; 这样的代码才叫 Matlab 代码,否则只能是不伦不类的代码: C 不 C , Matlab 不 Matlab. (2) 执行效率也更高; 这是次要的,随着 Matlab 对循环机制的优化,速度差异已不再那么明显,关键是( 1 ) 下面针对 Matlab 中常见的向量化处理问题方法,举例加以说明: (一)整体操作“大块数据” Matlab 为同型的数据块(向量或矩阵)的整体做运算提供了【点运算】,这里我借用《线性代数》里的说法,矩阵行数、列数相同称为同型矩阵, Matlab 里矩阵可能不止 2 维。 比如, A.*C 和 A./C 表示 A 与 C 的对应位置的各元素做 * 和 / 运算得到与它们同型的一个新矩阵。 例1. 物理实验利用测得的电压电流具体数据,验证欧姆定律 R=U/I. 代码 1 ( C 语言风格) U = ; I = ; L = length(U); S = 0; for k = 1:L R(k) = U(k)/I(k); S = S + R(k); end R = S/L 运行结果: R = 30.5247 代码 1 ’( Matlab 风格) U = ; I = ; R = U./I; R = mean(R) 运行结果: R = 30.5247 (二)尽量把【 C 语言风格的循环】向量化实现 见上例,再比如, 例2. 计算 1 + 1/3 + … + 1/99 代码 2 ( C 语言风格) s = 0; for k=1:2:99 s = s + 1/k; end s 运行结果: s = 2.9378 代码 2 ’( Matlab 风格) k=1:2:99; s = sum(1./k) 运行结果: s = 2.9378 注意:代码 2 ’中,不要写成 “for k=1:2:99”, 否则 k 就是变化的一个数值而不是数组了。 例3. 用间距为 0.1 的水平线和垂直线均匀分割 x ∈ × 的矩形域,在所有水平线和垂直线交点上计算函数 z=sin|xy| 的值,并图示。 ( 1 )求出各网格点的函数值 代码 3 ( C 语言风格)(注 2 ) x=-5:0.1:5; y=(-2.5:0.1:2.5)'; N=length(x); M=length(y); for ii=1:M for jj=1:N X0(ii,jj)=x(jj); Y0(ii,jj)=y(ii); Z0(ii,jj)=sin(abs(x(jj)*y(ii))); end end 代码 3 ’( Matlab 风格) =meshgrid(-5:0.1:5, -2.5:0.1:2.5); Z=sin(abs(X.*Y)); ( 2 )画图 surf(X,Y,Z) % 画三维图形 xlabel('x') % 标记坐标轴 ylabel('y') shading interp % 用插值处理色彩 view( ) % 旋转一定角度观看图形 (三)尽量使用 Matlab 现成的【矩阵操作语法和函数】 Matlab 提供了大量非常便捷的矩阵操作语法和操作矩阵的函数,优先使用它们来完成程序。 ( 1 )操作矩阵的函数,比如 =size(A) ——返回矩阵 A 的“型”, m 行 n 列 length(A) ——返回行数或列数中最大的那个 mean(A) ——返回 A 中所有元素平均值 sum(A) 或 sum(A,1) ——返回 A 各列元素之和,各行之和用 sum(A,2) = max(A) —— Y=A 各列元素的最大值 ; I= 各列最大值所在行 sort(A) ——矩阵各列按递增排序,递减排序加参数 ‘descend’ unique(A) ——返回矩阵 A 中不重复的值(去掉重复元素) 等等 ……….. 这些函数已经实现了通常所需要的各种操作,所以完全没有必要再去按 C 语言的思路去自己重写代码。 ( 2 )矩阵操作语法,主要是 “:”的使用,放到下次再具体来说 Matlab 学习系列 (3) ——矩阵操作 最后,习惯了 C 语言的思维,不是一下就能转变过来的,但要有意识地强迫自己写 Matlab 风格的代码,写 C 语言风格代码不如不写。 注1. C 语言循环和判断的机制是通用的, Matlab 里也有循环和判断,但是以向量或矩阵作为基本元素的循环和判断。 写 Matlab 循环代码时,尽量避免使用 i 和 j ,因为它俩是虚数单位( -1 开根号)。
个人分类: Matlab学习系列|19 次阅读|0 个评论
分享 Matlab学习系列001:先从C语言谈起
zhjx19 2015-1-17 18:57
前言 Matlab 作为最强大的数学建模软件非常有必要系统的学习一下,目前我大概算是【粗略地懂些 Matlab ,很多语法需要现用现查】的水平,所以打算不定期地学一点,同时也记录在这里供大家交流学习。 —————————————— 学任何一门计算机语言都得先理解其核心的编程思想,然后在该编程思想的指导下去学语法,否则学再多语法知识也达不到入门的水平。 多数人学编程都是从 C 语言开始的, C 语言是最重要的基础语言,在于: ———— 1. 它的引导编程入门 比起其他编程语言,大概是最适合的了。 2. 它的通用语法 即适用于任何编程语言的基础语法本质,表示形式是次要的(比如整型用 int ; if...else 是选择结构等等)。 3. 它的代码底层性 通常高级编程语言都是采用的【从大问题逐层细化到小问题,直到不能再小的问题】,这个【不能再小的问题】要实现的话就离不开底层代码编程, C 语言训练的恰恰是这个功底,这个功底也锻炼了阅读其他语言代码的能力。 同时,这也是 C 语言编程思想的体现 —— 面向过程(一步一步具体地实现解决小问题的过程)。 当然要进一步训练底层代码的功底,离不开《数据结构》。 ———— 学 C 语言就是要真正学会上面三条,这样再学其他编程语言的时候,才会事半功倍,才会快速学会。 比如学 C++ 或 Java ,它的面向过程部分,就是 C 语言改了几个命令名;基本只要专学 C++ 和 Jave 核心的【面向对象(它们的编程思想)】部分就可以了,而 C 语言底层功底训练,也为这部分的学习打下了基础。 但往往很多人,这 1, 2, 3 条没学好,反而把一些 C 语言固有,而和其他语言相抵触的部分,时刻牢记在心,这就适得其反了。比如说, “C 语言的编程思想 —— 面向过程 ” 基本上任何一门其他高级语言的核心编程思想都不是面向过程(面向过程训练,一个 C 语言就够了),你再带着面向过程的思想去学,根本就是不可能学会新语言的。这不是说面向过程没用,面向过程有用(见第 3. 条)但不是用在这坏事的。 所以,要学 Matlab ,首先要抛弃 C 语言那种【一个数值、一个数组元素地来操作 .... 来循环 .... 】的思想,转而强制自己接受 Matlab 的核心编程思想 —— 向量化编程(通过向量、矩阵来直接操作大块数据)。这也是下次的内容: Matlab 学习系列 (2)——Matlab 编程思想之向量化编程
个人分类: Matlab学习系列|22 次阅读|0 个评论
分享 数字图像处理基础matlab程序
daihong419 2014-12-4 09:32
数字图像处理基础matlab程序
clear clc I=imread('pout.tif'); %读入matlab自带图像'pout.tif' g=imadjust(I,stretchlim(I), ); %图像的灰度线性变换增强 subplot(231);imshow(I, );title('图像增强结果');%显示图像增强结果
个人分类: matlab图像处理|23 次阅读|0 个评论
分享 matlab循环命名一组数据
xiaoxin 2014-10-30 16:59
终于搞定这个折磨我好久的问题,呵呵 function = namef( a ) % ᄑᆱᄒ￘ᅰ￳ᄌ￷￁￐위ᄆ￰ᅢᅢ n=size(a,2); str={'Time','Open','High','Low' ,'Close','Volumn','Turnover'}; for i=1:n eval( ) end end
个人分类: matlab|15 次阅读|0 个评论
分享 函数quiver的matlab
♂德鹄荼 2014-7-30 16:48
函数quiver的matlab
= meshgrid(-2:.2:2); Z = X.*exp(-X.^2 - Y.^2); = gradient(Z,.2,.2); contour(X,Y,Z) hold on quiver(X,Y,DX,DY) colormap hsv grid off hold off 展示
个人分类: chengxu|12 次阅读|0 个评论
分享 关于matlab 7.1不能卸载的问题
海底浮云 2013-11-4 15:17
matlab 7.1不能卸载的问题困扰很久,今天终于找到了答案。具体步骤如下: 在matlab文件夹中找到uninstall.exe,右键选择“兼容性疑难解答(Y)”,等待一会儿出现“程序兼容性”对话框,选择“疑难解答程序”选项,然后选择第一个选项“此程序在以前版本的windows中正常工作,但不会立即安装或运行”,然后点击“下一步”,选择windows 2000,再点击下一步,最后点“启动程序”,便可以卸载了。这是详细解答改变matlab兼容性问题的过程。我刚试过,卸载有效哦~希望对你有帮助。
15 次阅读|0 个评论
分享 用matlab编BP神经网络预测程序
0538hucong 2013-5-10 19:16
求一用 matlab 编的程序 P= ; 输入 T= ; 输出 % 创建一个新的前向神经网络 net_1=newff(minmax(P), ,{'tansig','purelin'},'traingdm') % 当前输入层权值和阈值 inputWeights=net_1.IW{1,1} inputbias=net_1.b{1} % 当前网络层权值和阈值 layerWeights=net_1.LW{2,1} layerbias=net_1.b{2} % 设置训练参数 net_1.trainParam.show = 50; net_1.trainParam.lr = 0.05; net_1.trainParam.mc = 0.9; net_1.trainParam.epochs = 10000; net_1.trainParam.goal = 1e-3; % 调用 TRAINGDM 算法训练 BP 网络 =train(net_1,P,T); % 对 BP 网络进行仿真 A = sim(net_1,P); % 计算仿真误差 E = T - A; MSE=mse(E) x= ';% 测试 sim(net_1,x) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 不可能啊 我 2009
22 次阅读|0 个评论
分享 matlab 投資權重
bi913278 2013-3-19 08:48
matlab 投資權重
16 次阅读|0 个评论
分享 matlab 投資權重
bi913278 2013-3-19 08:47
matlab 投資權重
13 次阅读|0 个评论
分享 matlab 投資權重
bi913278 2013-3-19 08:46
matlab 投資權重
13 次阅读|0 个评论
分享 matlab 投資權重
bi913278 2013-3-19 08:45
matlab 投資權重
14 次阅读|0 个评论
分享 matlab 投資權重
bi913278 2013-3-19 08:43
matlab 投資權重
11 次阅读|0 个评论
分享 matlab 投資權重
bi913278 2013-3-19 08:40
matlab 投資權重
10 次阅读|0 个评论
分享 matlab 投資權重
bi913278 2013-3-19 08:36
matlab 投資權重
13 次阅读|0 个评论
分享 mathtype——修改字体大小
热度 1 翱翔的小狐狸 2012-10-18 16:38
1. word加载项mathtype 2.Equation Preference——This document's equation prefereces——按钮“Load From MathType Preference File…”——Times+Symbol 10.eqp——打开——OK 3Format Equations——mathtype's "New Equation"Preferences——OK 另一种 不在加载项 用MathType编出的公式字号好像比正文大一些? 这可能是一般WORD正文的缺省字号为5号字,但MathType的缺省字号为12pt(磅),只要在MathType中调出“尺寸→定义”,将一栏的值改为10.5pt(相当于5号字)即可。 批量修改(加载项) 如原文档中很多公式字号已是12pt(或更大更小),而需要将它们批量变成五号字(或其他字号),则可点击MathType菜单(安装后会在WORD的菜单栏上出现),在下拉菜单上点击“格式化方程” ,然后用“MathType的‘新方程’参数”或选 用内置或自定的“MathType参数文件”对公式格式化。具体操作一看菜单即可明 白。
个人分类: 论文写作|21 次阅读|2 个评论
分享 win7安装matlab
qiqfly 2012-10-11 18:49
windows7安装matlab matlab7.0 及以前版本在win7上有可能不能正常安装使用,建议安装7.1以后版本 Runtime Error解决办法: 右击MATLAB图标——选择“属性”——选择“兼容性”——在“运行兼容模式”前面打钩,在下拉菜单选择windows vista(sp1) 如果没有这一项的话,再选择windows xp(sp3)。 再不行的话更换主题,最好换成经典样式 再次运行,一切就OK了。 如果MATLAB运行后马上消失解决办法: 首先在MATLAB的程序文件中找到如下文件:atlas_Athlon.dll(AMD系列的请用这个,其他的CPU也有相应的问题件,就在MATLAB文件 夹下),这些是对应处理器的数值运算优化文件 然后请按如下步骤进行: 1、右击我的电脑,选择属性. 2、在"高级"选项卡中点击"环境变量" 3、在系统变量下面添加如下内容: 变量名:BLAS_VERSION 变量值:C:\Matlab7\bin\win32\atlas_Athlon.dll 如果你安装在D盘,前面就改成D:\Matlab7\bin\win32\atlas_Athlon.dll 注意事项: 1、MathWorks公司每年发布两个版本的MATLAB,上半年3月份左右发布a版,下半年10份左右发布b版。 2、MATLAB目前没有中文版,但MATLAB技术论坛制作了相关版本的汉化包。 3、一台计算机上可以同时安装多个MATLAB版本,它们之间相互独立互不干扰。 4、MATLAB的高级版本(7.6之后)基本都兼容Win7(即使不行,我们也可以使用兼容模式安装)。 5、MATLAB同时支持32和64位操作系统,安装包win32和win64两个文件夹分别与之对应。 6、大部分MATLAB版本在计算机重装之后,没有必要再次安装MATLAB,只要到MATLAB目录中,为MATLAB.exe创建一个桌面快捷方式,以后仍可以Happy的正常使用! 7、Matlab2008a(7.6)之后,符号工具箱默认使用MuPAD内核,在2010a中Maple符号计算引擎彻底被和谐!个人感觉MuPAD没有Maple内核好使,如果您热衷于Maple内核,请安装7.7之前的版本或者参见 http://www.matlabsky.com/thread-6061-1-1.html 8、对于普通用户,没有必要追求MATLAB最新版本,因为新版本安装程序大且运行速度慢(特别是启动初始化时,慢成蜗牛了),故建议普通安装MATLAB7.1经典版即可。
15 次阅读|0 个评论
分享 MATLAB中的set函数
lanruomuyu 2012-7-12 12:12
MATLAB中的set函数 1.MATLAB给每种对象的每一个属性规定了一个名字,称为属性名,而属性名的取值成为属性值。例如,LineStyle是曲线对象的一个属性名,它的值决定着线型,取值可以是'-' 、':'、'-.'、'--'或'none'。 2.属性的操作 set函数的调用格式为: set(句柄,属性名1,属性值1,属性名2,属性值2,…) 例子: clear x=0:0.2:12; y1=bessel(1,x); y2=bessel(2,x); y3=bessel(3,x); h=plot(x,y1,x,y2,x,y3); set(h,{'LineWidth'},{2;5;8}) %set(h,{'LineWidth'},{2})==set(h,'LineWidth',2),将所有线宽设置为2 set(h,{'Color'},{'r';'g';'b'},{'LineStyle'},{'--';':';'-.'}) %设置颜色和线宽 axis( ) %设置坐标轴范围 grid on X=0:1:12; Y=-0.5:0.25:1; set(gca,'xtick',X,'ytick',Y) %设置网格的显示格式,gca获取当前figure的句柄 set(xlabel('Time'),'FontSize',12,'Color','r') y=ylabel('Amplitude'); set(y,'FontSize',12,'Color','g') legend(h,'First','Second','Third') %添加图例 title('Bessel Functions') %添加标题 =min(y1); %找到y1的最小值以及改值的下标,赋给y和ix text(x(ix),y,'First Min \rightarrow','HorizontalAlignment','right') %插入文本 具体可改哪些属性值见贴 http://blog.ednchina.com/xth543/218124/Message.aspx 这两天在看句柄式图形方面的东西,以下是我在看书过程中整理的学习笔记,比较详细的介绍了句柄以及与其密切相关的各种图形对象和它们的属性。希望能对初学Matlab界面设计的朋友们有所帮助。 GUI学习笔记: 句柄式图形常用函数: (1)get(h)返回句柄值h所指定的图形对象的所有属性名称与相对应的属性值 (2)a = get(h)返回由句柄值h所指定的图形对象的属性结构数组,并且该数组的字段名称就是该对象的属性名称。 (3)a = get(0,'factory')返回所有能由用户设置的属性的默认定义值。 (4)a = get(0,'FactoryObjectTypePropertyName1','FactoryObjectTypePropertyName2',...)返回指定对象类型指定的属性值,输入参数FactoryObjectTypePropertyName为一个关键词,由字符Factory与图形对象类型(如Figure)还有属性名称(如Color)组成。 a = get(0,'factoryFigureColor')返回Figure对象的Color属性值。 (5)a = get(h,'DefaultObjectTypePropertyName1','DefaultObjectTypePropertyName1',...)返回句柄值为h的对象指定属性的默认值。如“DefaultFigureColor”。 (6)a = get(h,'default')列出h对象的所有属性的默认属性值 (7)a = set(h)返回句柄值h所指定的图形对象的所有属性名称对应的可设置属性值,a为结构数组,存储对象的属性名称,其字段值为相对应的属性值。属性值中用{}括起来的表示默认值。 (8)set(h,a)使用指定的属性值来设置由句柄值h所指定的对象属性,a为结构数组,其字段名称为对象的属性名称,字段值为相对应的属性值。 (9)a = set(0,'factory')返回那些用户可以设置默认值的所有对象的属性,同时显示可设置的属性值。 (10)a=set(0,'FactoryObjectTypePropertyName')返回所有对象中指定的属性名称FactoryObjectTypePropertyName的所有可能的属性值。 (11)a = set(h,'属性名','属性值')设置句柄值为h的对象的与属性名对应的属性值。 (12)set(h,'DefaultObjectTypePropertyName1','DefaultObjectTypePropertyName2',...)对句柄值为h的对象设置特定属性名称的属性默认值。 (13)H = findobj;返回Root对象与其所有子对象的句柄值 (14)H = findobj(h);返回h变量的句柄值 (15)H = findobj(’属性名称‘,’属性值‘);依据对象的属性名称和属性值找出匹配的对象句柄值。 (16)H = findobj(ObjectHandles,’属性名称‘,’属性值‘);根据限定的对象列表找出与对象的属性名称和属性值匹配的对象句柄值 (17)gcf返回当前Figure对象的句柄值 gca返回当前axes对象的句柄值 gco返回当前鼠标单击的句柄值,该对象可以是除root对象外的任意图形对象,并且Matlab会把当前图形对象的句柄值存放在Figure的CurrentObject属性中 Figure对象的属性篇 (1).^是矩阵每个元素的幂乘,^是数的幂乘。 (2)set(handle)列出句柄值为handle的对象的所有属性 get(handle)除列出上述属性外,还列出可以设置的属性 reset(handle)将所有属性改为默认值 delete(handle)删除句柄值为handle的图形对象 (3)利用set(handle,‘属性名称’)获得句柄值为handle的对象的属性名称下所有可设置的属性值 set(gcf,'units):得到 ,其中,大括号中是默认值 (4)clf reset;将窗口关闭,并重新设置其属性为默认值。 (5)Closerequestfcn,有效值为字符串或函数句柄(前加@) 当关闭绘图窗口或离开Matlab时,就会定义Closerequestfcn定义的函数 (6)createfcn,当Matlab建立一个对象时(如为figure对象,即打开一个绘图窗口),就会触发createfcn所定义的callback程序。如set(0,'defaultfigurecreatefcn','set(gcbo,''integerhandle'',''off'')');即设置了根对象的默认值,使每次建立figure对象时,都会指定一个非整数的句柄值。(在用户未指定句柄值时) (7)将当前窗口中在键盘上按下的按键名显示出来。 set(gcf,'keypressfcn','get(gcf,''currentcharacter'')') (8)color有效值为colorspec colorspec表: RGB 简称 y_yellow m_magenta c_cyan r_red g_green b_blue w_white k_black (9)linspace(a,b,c):a初始b结束c线性分段次数linspace(a,b)则默认100次 (10)CurrentObject:有效值为图形对象句柄值:返回绘图窗口内当前被鼠标选取的对象的句柄值 (11)currentPoint:有效值 返回绘图窗口中最后单击鼠标的位置,用get(gcf,'currentpoint')就会返回当前在窗口中单击鼠标的位置 (12)DeleteFcn:有效值:字符串或函数句柄,删除对象(这里为figure)时会触发Deletefcn所定义的Callback程序。 (13)Dockcontrols:有效值为on/off,默认值on,控制窗口的嵌入效果是否可用。 (14)Hittest:有效值on/off,决定能否用鼠标选取对象为当前对象。 (15)Integerhandle:有效值on/off,决定Figure对象句柄值的类型为整数或浮点小数。 (16)Interruptible:有效值on/off,执行过程中需要中断程序而优先执行其他程序时要设该属性为on。即Interrupptible属性是用以控制当Callback执行时是否能被其他事件(如此时鼠标按下其他控制对象)而中断,on是会中断,off时会执行完当前Callback,再去执行其他Callback。 (17)Keypressfcn:有效值为字串或函数句柄。当用户在figure窗口中按下键盘的任意键时,就会执行Keypressfcn所定义的Callback程序。 figure('keypressfcn','fprintf(''当前按下键盘上的%c键\n'',get(gcf,''currentcharacter''))')在这个figure窗口中按下键盘上的按键时就会立即返回对应的字符,依据这个效果就可以决定当字符键被按下时所要执行的操作。 当这个属性指定的值是一个函数句柄时,Matlab就会将这个函数视为一个结构,包含下列字段——character(以当前键盘上按下的按键显示的字符来当作结果),modifier(包含一个或多个识别键盘上按下按键字符名称的细胞数组(如Ctrl,Alt,Shift等),key(显示被按下的键)。 (18)WindowButtonDownFcn:有效值为字符串或函数句柄 当鼠标在绘图窗口内按下鼠标任意键时,将触发WindowButtonDownFcn所定义的Callback以产生相对应的操作。 (19)WindowButtonMotionFcn:有效值为字符串或函数句柄 当鼠标在绘图窗口内按住鼠标任意键移动,将触发WindowButtonMotionFcn所定义的Callback以产生相对应的操作。 (20)WindowButtonUpFcn:有效值为字符串或函数句柄 当鼠标在绘图窗口内释放鼠标任意键时,将触发WindowButtonUpFcn所定义的Callback以产生相对应的操作。 (21)CurrentAxes有效值为当前坐标轴的句柄值,返回当前的坐标轴句柄值。假设某坐标轴句柄值为a_h,可以使用axes(a_h)或set(gcf,'currentaxes',a_h)这两种方式,制定句柄值为a_h的坐标轴为当前坐标轴。 (22)CurrentCharacter:有效值为任意字符,返回用户在绘图窗口中最后输入的一个字符,即刚在键盘上按下的字符键将存储到Currentcharacter中,一般于Keyppressfcn合用。 (23)Currentobject有效值为图形对象的句柄值,返回绘图窗口内当前被鼠标选取的对象的句柄值。 (24)有效值为两元素的向量, 返回绘图窗口中最后单击鼠标的位置,与Windowbuttonmotionfcn,Windowbuttonupfcn合用。使用get(gcf,'currentpoint')就会返回当前在窗口中单击鼠标的位置。 Axes对象的属性 (1)title('new','color','r');给坐标轴命名为new,红色 title({'this title','has 2 '});命名为两行的标题 (2)Units:有效值为pixels/normalized/inches/centimeters/points/characters 决定各种位置属性的度量单位,相对于窗口左下角为基准。当设置为Pixels时,以像素为单位;当设置为normalized时,以坐标为单位,屏幕的左下角为 ,右上角为 。 (3)grid on:在图像中显示网格。 (4)children:控制axes对象的子对象,即image\light\line\patch\rectangle\surface和text等对象,可通过get(gca,'children')来返回当前坐标轴的子对象构成的句柄值向量。 (5)字体属性: Fontangle字体角度(正常normal或斜体italic/oblique) Fontname字体名称 fontsize字体大小(单位由Fontunits决定) fontunits字体单位(points/normalized/inches/centimeters/pixels) fontweight字体粗细(normal/bold/light/demi) gridlinestyle决定坐标轴网格线的样式,‘-’为实线‘- -’为虚线‘:’为点线‘-.’为点虚线 plot(1:10);grid on;set(gca,'gridlinestyle','-.');将当前坐标轴显示的网格线为点-虚线 (6)linewidth 定义X,Y和Z轴的轴线宽度(以点单位定义) (7)NextPlot:有效值为add|replace|replacechildren,默认为replace add表示使用当前的坐标轴,把新的图形对象加到此坐标轴中是一般保留的做法,replace表示重新设置坐标轴的所有属性(Position除外),也就是在绘图前会删除当前坐标轴和它的子对象。replacechildren表示移除当前坐标轴中所有子对象,但不重新设置坐标轴的所有属性 (8)Outerposition决定坐标轴外边界的位置。由位置向量 组成,其中left,bottom表示相对于绘图窗口左下角的位置,width,height表示区域尺寸,默认为 (9)Position由位置向量 组成,决定坐标轴位置 (10)Tag定义本坐标轴的卷展栏,因为每一个对象都有自己唯一的识别码即tag,以方便findobj函数查找坐标轴句柄值。 (11)visible决定坐标轴是否可见 (12)set(gca,'xgrid','on')绘制X轴垂直网格线 set(gca,'gridlinestyle',':','linewidth',3)设置网格线线条类型和宽度 set(gca,'box','on')将图轴方框绘制出来 (13)set(gca,'xscale','linear');将X轴刻度设为线性 set(gca,'yscale','log');将Y轴刻度设为对数 (14)disp()显示一个数组,但不显示其数组名称 disp(' Corn Oats Hay') disp(rand(5,3)) which results in Corn Oats Hay 0.2113 0.8474 0.2749 0.0820 0.4524 0.8807 0.7599 0.8075 0.6538 0.0087 0.4832 0.4899 0.8096 0.6135 0.7741 Pause:pause, by itself, causes M-files to stop and wait for you to press any key before continuing. 实例:plot(1:10);set(gca,'yscale','log'); disp('请按下Enter键'); pause set(gca,'Yscale','linear');本例是说按下Enter键将Y轴刻度由对数改为线性。 (16)Xtick,Ytick,Ztick:控制X,Y,Z轴坐标刻度记号的位置,即控制坐标轴上刻度记号的位置以及每隔多少值会到下一个刻度记号的位置,同时还需要配合Xticklabel、Yticklabel、Zticklabel属性来调整。详细见例程。 以下设置方式相同: set(gca,'Xticklabel',{'1';'10';'100'}) set(gca,'Xticklabel','1|10|100') set(gca,'Xticklabel', ) set(gca,'Xticklabel', ) (17)Findobj:查找 Line对象 当用户建立一个线对象时,就会触发Createfcn所定义的Callback产生相对应的操作;同样,若删除一个线对象时,就会触发DeleteFcn所定义的Callback产生相对应的操作。以下程序建立一个线对象,并设置DeleteFcn为一个问题对话框,当删除该线对象时,就会显示其问题对话框来询问用户。 (1) clipping:有效值为on/off,默认值为on 设置坐标轴土筐是否可以剪辑,如果设为off,则绘制线对象时可超出坐标轴的图框。 (2)Linewidth:有效值为纯量(与向量相对,只有大小而无方向),点为单位。 (3)Marker:有效值为字符,决定Line对象的记号类型,有+,o,*,.,x,s,d,等 (4)Markersize:有效值为纯量,单位为点,Marker的大小。 (5)UIcontextmenu:有效值为uicontextmenu对象的句柄值,定义与线对象相关联的uicontextmenu菜单,因此当用户将该线对象的属性UicontextMenu设置为相关联的uicontextmenu对象的Tag名称时,uicontextmenu就可以在该线对象上单击鼠标右键来显示uicontextmenu菜单。 (6)Tag:有效值为字符串,定义改线对象的卷展栏(即标记) (7)Type:有效值为字符串(只读),此处为’line‘字符串。 (8)Xdata,Ydata,Zdata:有效值为坐标数组,指定产生线条的数据点,若为2D环境则Xdata、Ydata需要有相同数目的数据,而Zdata为空矩阵;3D环境则Xdata,Ydata,Zdata三者都需要有相同数目的数据。 例:x=0:5,y=x+10;line('xdata',x,'ydata',y); Patch对象 patch函数不想其他高级区域建立函数(fill和area),只是简单地将patch对象添加到当前坐标轴中而已。 使用:patch(X,Y,C) 在当前的坐标轴中添加二维填充的patch对象,X和Y用以定义patch对象顶点的位置,若X,Y为矩阵,则Matlab按每一行的元素来产生多个多边形。 例:x = ; y = ; z = ;(x(1,1),y(1,1),z(1,1)为第一个面的第一个顶点,x(2,1),y(2,1),z(2,1)为第一个面的第二个顶点,以此类推) tcolor(1,1,1:3) = ; tcolor(1,2,1:3) = ; patch(x,y,z,tcolor);(tcolor是一个1*2*3的三维矩阵) Surface对象 surface可以建立一个surface对象,surface是由矩阵数据所在的列索引值为X坐标,而行索引值为Y坐标,并且矩阵的每个元素值为Z坐标。 image对象 image(C)将矩阵C当作一个图像来显示,C的每一个元素定义一个图像中矩阵线段的颜色。 image(x,y,C)其中x与y为2元素的向量,分别指定X轴与Y轴卷展轴的范围。C为图像矩阵。 text对象 (1)text(x坐标,y坐标,'string')在图形中指定位置(x,y)显示字符串string。 (2)Editing有效值为on/off,off时,用户在执行GUI操作时无法直接在该Text对象上进行编辑,改为on后,可以进行编辑。 (3)HorizontalAlign 有效值为left/center/right决定Text对象中字符水平方向的对齐方式。 (4)Interpreter有效值为tex/none,决定Text对象中是否可用Tex字符注释,当设置为Tex时,表示允许用户能够在String属性下输入Tex字符。以下为在窗口的 点位置处建立一个text对象并且字体大小以16点来表示的一个方程式。(显示的是一个二重积分) text('interpreter','latex','string','$$\int_0^x\!\int_y dF(u,v)$$','position', ,'fontsize',16) (5)String有效值为字符串,表示要显示出来的字符串是什么。 (6)verticalAlignme 有效值为top/cap/middle/baseline/bottom决定Text对象垂直对齐的方式。 下面加载一个例子,是ilovematlab论坛一个斑竹的回复 x=0:0.5:10; y1=sin(x); y2=cos(x); plot(x,y1,'r',x,y2,'g') findobj(gca,'color','r') 不想要的曲线直接delete句柄就可以了 --------------------------------------------------------------------------------------- gcf 是返回当前被激活的窗口的图形对象的句柄。你可以认为它就指代当前窗口。 figure(gcf)打开这个窗口。 gca返回当前axes对象的句柄值 gco返回当前鼠标单击的句柄值,该对象可以是除root对象外的任意图形对象,并且Matlab会把当前图形对象的句柄值存放在Figure的CurrentObject属性中 Figure对象的属性篇
个人分类: 数学建模|13 次阅读|0 个评论

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-3-29 00:29