小编Rém*_*gel的帖子

矩阵乘法向量 - R 与 Matlab

我观察到,在 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)

performance matlab r

7
推荐指数
2
解决办法
238
查看次数

调整窗口大小后无法正确检索鼠标坐标

下面是一个简化的代码,显示了我面临的问题.

该代码的目的是创建一个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 sdl

5
推荐指数
1
解决办法
475
查看次数

TIFF图像:16bits-RGBA图像像素是如何隔行扫描的?

我试图通过C语言处理每通道16位RGBA TIFF图像,我在规范中找不到关于16位图像的大量信息.

在每通道8位RGBA图像的情况下,我理解像素存储为uint32,并且可以通过将32位分组为8位的4组(R,G,B,A)来进行解交织.然后为了处理每通道8位RGBA图像,我正在做以下事情(另请参见此处附带的源代码):

  1. 我将图像数据存储为我调用的uint32选项卡(使用TIFFReadRGBAImageOriented) data_tiff
  2. 我使用下列命令去隔行像素:(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)
  1. 我将图像数据作为uint64选项卡读取
  2. 我使用隔行像素(uint16) TIFF16GetR(*data_tiff),(uint16) TIFF16GetG(*data_tiff),(uint16) TIFF16GetB(*data_tiff)及(uint16) TIFF16GetA(*data_tiff)

但似乎数据本身并未存储在uint64选项卡中,所以我想知道如何将每通道16位的图像隔行扫描到uint32像素选项卡中.

我也面临着以相同方式处理16位灰度图像的困难(使用TIFFReadRGBAImageOriented获取图像数据并尝试将每个像素转换为uint16)

更一般地说,你有任何关于16位灰度和彩色图像的文档吗?

谢谢您最好的问候,

雷米A.

c image libtiff

5
推荐指数
1
解决办法
1290
查看次数

标签 统计

c ×2

image ×1

libtiff ×1

matlab ×1

performance ×1

r ×1

sdl ×1