matlab的内存问题

昨天晚上运行实验,早上过来,看到这样的错误

??? A read error occurred while reading from lab 3.  This is causing:
java.lang.ArrayIndexOutOfBoundsException: 0

查了一下,又是内存错误:

http://www.mathworks.com/matlabcentral/newsreader/view_thread/235387

http://www.mathworks.com/support/solutions/en/data/1-18I2C/index.html

可以通过设置Java虚拟机的heap size来解决。

不过不准备这么做了,因为这不是根本解决之道。

matlab很容易写出处理大批量数据的程序。也就容易搞出内存过载的问题。

准备回到以前的老路,把每个小块的结果单独save起来,起一个容易查询的文件名。这样也方便增量式的处理。

如果块不多的话,应该也还好。块太多会引起经常的读写,对硬盘不好。

matlab

几乎天天用matlab写程序

没有matlab生活简直都没法想象了

其实matlab应该算是最成熟的script语言了

function handle很好用,也很必要

scripts可以套用

structure的field可以动态创建,动态增长,这都很方便

画图很方便

工具箱很多,基本上不用找什么第三方类库

一个完整,统一,简单的世界

也许唯一的问题是效率,部署

matlab的一些语法之三

匿名函数,以及函数对象

sqr = @(x) x.^2;

fhandle = @functionname

python中的lambda语句似乎就相当于matlab中的匿名函数。看来这东西在脚本语言里还挺流行的。下面是一个例子:

fplot(@(x) a*x.^2 + b*x + c, [-25 25])

fplot接受一个函数对象,打印这个函数的曲线。没有匿名函数似乎真的很麻烦。

下面是另外一个例子,同时还包括嵌套函数:

function fhandle = makeParabola(a, b, c)
% MAKEPARABOLA returns a function handle with parabola
% coefficients.

fhandle = @parabola;       % @ is the function handle constructor

   function y = parabola(x)
   y = a*x.^2 + b*x + c;
   end
end

用的时候,相当于给定三个参数生成一个函数对象,然后使用这个函数对象进行操作,比如:

h = makeParabola(1.3, .2, 30);

h(25)
ans =
  847.5000

Java里面可以这么做:第一种方式:定义一个类Parabola,三个成员变量a, b, c。然后调用成员函数。第二种方式:对于多种函数,定义一个接口。然后让Parabola实现这个接口。对于前面的fPlot。定义一个接口为interface F{double f(double x);}。这是面向对象的方式,好处不少。就是有时没那么简洁。

matlab的一些语法之二

bills = [patient.billing]
bills =
  127.0000   28.5000  504.7000

patient是一个结构数组,对应于c可以这么看:

struct PatientElem {
double billing
} PatientElem;
PatientElem patient[N];

matlab中的[patient.billing]就相当于[patient[1].billing patient[2].billing … patient[N].billing]。然后就可以做这样的操作:

total = sum ([patient.billing]);

matlab的结构类型

//虽然N年前就开始接触matlab,但今天才第一次好好看了一下帮助文档的编程介绍

MATLAB automatically builds the structure as you go along.
似乎没有必要定义什么struct的类型。似乎也无法定义。因为变量的类型在运行时是可以变化的。比如

a.b = 1

那么a就是个struct变量。它包含b这个成员变量。接着可以这么写:

a.c = 2

现在,a的成员变量又多了一项,就是c。再接着写:

a(2).b = 3

现在,a的类型是个结构数组。再接着写:

a(2).d = 4

现在,a这个数组中的结构类型有三个成员变量:b, c, d。a(1)中之前没赋值的成员变量自动定义为空。接着写:

a(3).b.e = 5

现在,结构类型又变化了,原先的成员变量b不再是数值型,而是一个含有成员变量e的结构类型。

//真是有意思