我观察到,在 R(版本 3.6.1)中用大矩阵进行向量乘法的矩阵比在 Matlab(版本 2019b)中慢得多,而两种语言都依赖于(相同的?)BLAS 库。请参阅下面的最小示例:
在 Matlab 中:
n=900;
p=900;
A=reshape(1:(n*p),[n,p]);
x=ones(p,1);
tic()
for id = 1:1000
x = A*x;
end
toc()
Run Code Online (Sandbox Code Playgroud)
在 R 中:
n=900
p=900
A=matrix(c(1:(n*p)),nrow=n,ncol=p)
x=rep(1,ncol(A))
t0 <- Sys.time()
for(iter in 1:1000){
x = A%*%x
}
t1 <- Sys.time()
print(t1-t0)
Run Code Online (Sandbox Code Playgroud)
使用同一台计算机,我在 Matlab 中的运行执行时间大约为 0.05 秒,而在 R 中为 3.5 秒。知道这种差异的原因吗?
谢谢。
[编辑]:我在 C 中添加了一个类似的微积分(使用 CBLAS 库,编译使用gcc cblas_dgemv.c -lblas -o cblas_dgemv,其中 cblas_dgemv.c 表示下面的源文件)。我得到的运行时间大约为 0.08 秒,这与使用 Matlab 获得的运行时间(0.05 秒)非常接近。我仍在试图找出 R 中如此巨大的运行时间(3.5 秒)的原因。
#include <stdlib.h>
#include <stdio.h>
#include …Run Code Online (Sandbox Code Playgroud) 下面是一个简化的代码,显示了我面临的问题.
该代码的目的是创建一个512x512窗口,并在检测到左键时将其顶层表面的Y维度更改为512x(512 + 25).当检测到另一个左击时,我们将尺寸放回到512x512.
当检测到左击事件或检测到a mouseMotionEvent时,我们显示(带printf())鼠标坐标.
观察到奇怪的行为:
当我运行代码时,我左键单击一次,窗口的Y维度发生变化,但是当我在新创建的区域内移动鼠标时,显示的Y坐标会粘到511.
有时我没有得到这种奇怪的行为,那么Y坐标可能会大于511.为了得到奇怪的行为,左键单击几次,快速移动鼠标.
编译(linux):
$ gcc -o test test.c `sdl-config --cflags --libs`
Run Code Online (Sandbox Code Playgroud)
资料来源:(test.c)
#include <stdlib.h>
#include <stdio.h>
#include <SDL.h>
/* Prototypes */
void event_handler(void);
/* global variables declaration */
SDL_Surface *screen=NULL;
/***** MAIN FUNCTION *****/
int main(int argc, char** argv)
{
/* init SDL */
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
fprintf(stderr, "Erreur à l'initialisation de la SDL : %s\n", SDL_GetError());
exit(EXIT_FAILURE);
}
if ((screen = SDL_SetVideoMode(512, 512, 32, SDL_SWSURFACE )) == …Run Code Online (Sandbox Code Playgroud) 我试图通过C语言处理每通道16位RGBA TIFF图像,我在规范中找不到关于16位图像的大量信息.
在每通道8位RGBA图像的情况下,我理解像素存储为uint32,并且可以通过将32位分组为8位的4组(R,G,B,A)来进行解交织.然后为了处理每通道8位RGBA图像,我正在做以下事情(另请参见此处附带的源代码):
data_tiff(uint8) TIFFGetR(*data_tiff),(uint8) TIFFGetG(*data_tiff),(uint8) TIFFGetB(*data_tiff)及(uint8) TIFFGetA(*data_tiff)如果每通道RGBA图像为16位,您能告诉我如何对像素进行去隔行扫描?如果我可以将图像数据作为uint64选项卡进行检索,那么我可以执行以下操作:
#define TIFF16GetR(abgr) ((abgr) & 0xffff)
#define TIFF16GetG(abgr) (((abgr) >> 16) & 0xffff)
#define TIFF16GetB(abgr) (((abgr) >> 32) & 0xffff)
#define TIFF16GetA(abgr) (((abgr) >> 48) & 0xffff)`
Run Code Online (Sandbox Code Playgroud)
(uint16) TIFF16GetR(*data_tiff),(uint16) TIFF16GetG(*data_tiff),(uint16) TIFF16GetB(*data_tiff)及(uint16) TIFF16GetA(*data_tiff)但似乎数据本身并未存储在uint64选项卡中,所以我想知道如何将每通道16位的图像隔行扫描到uint32像素选项卡中.
我也面临着以相同方式处理16位灰度图像的困难(使用TIFFReadRGBAImageOriented获取图像数据并尝试将每个像素转换为uint16)
更一般地说,你有任何关于16位灰度和彩色图像的文档吗?
谢谢您最好的问候,
雷米A.